2012-11-16 77 views
6

我想获得一个SQL Server数据透视表的工作,使我可以计数,然后总和列数(总共6)。数据透视表的目的是为任意数量的生产站点汇总在线问卷调查结果。有6个问题可以有3个结果值 - 目标,行动和失败。我想要做的是计算每个问题的目标,行动和失败数量,然后对每个问题进行总结。所以,例如,生产现场A可以有2个目标,2个动作和2个失败。SQL Server数据透视表与计数和总和

我的理解是,SQL Server数据透视表可以提供此信息,然后可以在ASP.Net ReportViewer中显示。下面是我的代码,但它不能正常工作,并能与一些专家帮助做:

 SELECT PRODUCTION_Site, 
    [Target], 
    [Action], 
    [Fail] 
    FROM 
    (SELECT Production_Site, 
      SUM(Coding), 
      SUM(Measurable), 
      SUM(Appearance), 
      SUM(Aroma), 
      SUM(Flavour), 
      SUM(Texture) 
       FROM t_Pqe_Grocery 
       GROUP BY Production_Site) AS T 
      PIVOT 
     (
      COUNT(Coding) FOR Grocery_Packaging_And_Coding IN ([Target],[Action],[Fail]) 
      COUNT(Measurable) FOR Grocery_Measurable IN ([Target],[Action],[Fail]) 
      COUNT(Appearance) FOR Grocery_Appearance IN ([Target],[Action],[Fail]) 
      COUNT(Aroma) FOR Grocery_Aroma IN ([Target],[Action],[Fail]) 
      COUNT(Flavour) FOR Grocery_Flavour IN ([Target],[Action],[Fail]) 
      COUNT(Texture) FOR Grocery_Texture IN ([Target],[Action],[Fail])) AS P 

是否有办法解决这,或者是透视表没有解决办法?

表是

Production_Site, 
Grocery_Packaging_And_Coding, 
Grocery_Measurable, 
Grocery_Appearance, 
Grocery_Aroma, 
Grocery_Flavour, 
Grocery_Texture 

表中数据将是这样的:

Site A, Target, Action, Fail, Target, Target, Target 
Site B, Target, Action, Fail, Target, Target, Target 
Site C, Target, Target, Target, Target, Target, Target 
Site A, Target, Target, Target, Target, Target, Target 

我正在寻找的结果是

Production_Site | Target | Action | Fail 
Site A    10  1  1 
Site B    4  1  1 
Site C    6  0  0 
+0

您能否提供表结构,一些样本数据以及所需的'PIVOT'结果? – Taryn

+0

我保留这个主要数据 - 检查原始问题的详细信息 – Andy5

+0

什么是行不通的?你能设置一个SQL小提琴的例子吗? –

回答

10

一个执行此查询更为方便的方法将同时应用UNPIVOTPIVOT函数:

select * 
from 
(
    select Production_Site, value 
    from t_Pqe_Grocery 
    unpivot 
    (
    value 
    for col in (Grocery_Packaging_And_Coding, Grocery_Measurable, 
       Grocery_Appearance, Grocery_Aroma, 
       Grocery_Flavour, Grocery_Texture) 
) unp 
) src 
pivot 
(
    count(value) 
    for value in ([Target], [Action], [Fail]) 
) piv 

SQL Fiddle with Demo

UNPIVOT需要你的列清单,并将其转换为多行,这使得它更容易算:

select Production_Site, value 
from t_Pqe_Grocery 
unpivot 
(
    value 
    for col in (Grocery_Packaging_And_Coding, Grocery_Measurable, 
       Grocery_Appearance, Grocery_Aroma, 
       Grocery_Flavour, Grocery_Texture) 
) unp 

逆透视结果:

| PRODUCTION_SITE | VALUE | 
---------------------------- 
|   Site A | Target | 
|   Site A | Action | 
|   Site A | Fail | 
|   Site A | Target | 
|   Site A | Target | 
|   Site A | Target | 
|   Site B | Target | 
|   Site B | Action | 
|   Site B | Fail | 
|   Site B | Target | 
|   Site B | Target | 
|   Site B | Target | 
|   Site C | Target | 
|   Site C | Target | 
|   Site C | Target | 
|   Site C | Target | 
|   Site C | Target | 
|   Site C | Target | 
|   Site A | Target | 
|   Site A | Target | 
|   Site A | Target | 
|   Site A | Target | 
|   Site A | Target | 
|   Site A | Target | 

然后将PIVOT应用于此将得到计数你需要为每个PRODUCTION_SITE s。加入PIVOT后,结果为:

| PRODUCTION_SITE | TARGET | ACTION | FAIL | 
-------------------------------------------- 
|   Site A |  10 |  1 | 1 | 
|   Site B |  4 |  1 | 1 | 
|   Site C |  6 |  0 | 0 | 
+0

谢谢,但最后一个问题是,例如,如果用户想要查看3个站点,可以将一个where子句添加到数据透视表中而不是一段时间内的所有网站? – Andy5

+0

@ Andy5是的,你仍然可以应用'WHERE'子句来限制任何结果 - 与此类似 - http://sqlfiddle.com/#!3/cd888/23 - 你甚至可以应用WHERE '内部'UNPIVOT'查询的子句 – Taryn