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

Posted

技术标签:

【中文标题】带有计数和总和的 SQL Server 数据透视表【英文标题】:SQL Server Pivot Table with Counts and Sums 【发布时间】:2012-11-05 02:47:42 【问题描述】:

我正在尝试使 SQL Server Pivot 表正常工作,该表允许我对多个列(总共 6 个)进行计数然后求和。数据透视表的目的是汇总任意数量的生产站点的在线问卷调查结果。有 6 个问题可以有 3 个结果值 - Target、Action 和 Fail。我要做的是计算每个问题的目标、操作和失败的数量,然后对每个问题进行总结。因此,例如,生产站点 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

有没有办法解决这个问题,或者数据透视表不是解决方案?

表是

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

【问题讨论】:

能否提供PIVOT的表结构、一些示例数据以及想要的结果? 我将此保留在主要数据中 - 请查看原始问题以了解详细信息 什么不起作用?你能设置一个 SQL Fiddle 示例吗? 刚刚添加了一些表结构、数据和我想要达到的结果的示例 【参考方案1】:

执行此查询的一种更简单的方法是应用 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_SITEs 的计数。添加PIVOT 后的结果是:

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

【讨论】:

谢谢,但最后一个问题是,例如,如果用户想在一段时间内查看 3 个站点而不是所有站点,是否可以向枢轴添加 where 子句? @Andy5 是的,您仍然可以应用 WHERE 子句来限制任何结果 - 类似于此 -- sqlfiddle.com/#!3/cd888/23 -- 您甚至可以将 WHERE 子句应用于内部UNPIVOT查询

以上是关于带有计数和总和的 SQL Server 数据透视表的主要内容,如果未能解决你的问题,请参考以下文章

带有文本值的 SQL Server 数据透视表

在 SQL Server 中使用逐行总和进行透视[关闭]

php sql中带有日期、变量类别和总和值的数据透视表

SQL Server 数据透视 + 总和 + 分组依据

HIVE 数据透视和总和/计数

从 SQL Server DB 更新单独工作表中的数据后自动刷新 Excel 2007 数据透视表