带计数和总和的SQL Server数据透视表

And*_*dy5 8 t-sql sql-server pivot unpivot

我试图让SQL Server Pivot表工作,允许我计算,然后总结一些列(总共6列).数据透视表的目的是汇总任意数量生产站点的在线调查问卷结果.有6个问题可以有3个结果值 - 目标,动作和失败.我想要做的是计算每个问题的目标,动作和失败的数量,然后对每个问题加以总结.因此,例如,生产站点A可能有2个目标,2个动作和2个失败.

我的理解是SQL Server Pivot表可以提供这些信息,然后可以在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
Run Code Online (Sandbox Code Playgroud)

有没有办法解决这个问题,还是Pivot表不是解决方案?

表是

Production_Site,
Grocery_Packaging_And_Coding,
Grocery_Measurable,
Grocery_Appearance,
Grocery_Aroma,
Grocery_Flavour,
Grocery_Texture
Run Code Online (Sandbox Code Playgroud)

表格中的数据是这样的:

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
Run Code Online (Sandbox Code Playgroud)

我正在寻找的结果是

Production_Site | Target | Action | Fail
Site A              10       1       1
Site B               4       1       1
Site C               6       0       0
Run Code Online (Sandbox Code Playgroud)

Tar*_*ryn 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
Run Code Online (Sandbox Code Playgroud)

请参阅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
Run Code Online (Sandbox Code Playgroud)

未透露结果:

| 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 |
Run Code Online (Sandbox Code Playgroud)

然后应用于PIVOT此将获得您想要的每个PRODUCTION_SITEs 的计数.添加PIVOT结果后是:

| PRODUCTION_SITE | TARGET | ACTION | FAIL |
--------------------------------------------
|          Site A |     10 |      1 |    1 |
|          Site B |      4 |      1 |    1 |
|          Site C |      6 |      0 |    0 |
Run Code Online (Sandbox Code Playgroud)