sql - 在 sql server 2008 中使用带有列和行总数的数据透视表

标签 sql sql-server-2008 pivot

我有一个包含以下列的表格

defect_id, developer_name, status, summary, root_cause, 
Secondary_RC, description, Comments, environment_name

栏目root_cause以 Enviro、Requi、Dev、TSc、TD、Unkn 作为其值(value)观和
列 environment_name 有 QA1、QA2、QA3

我需要准备以下格式的报告
    Enviro Requi  Dev TSc  TD Unkn  Total
QA1    9    1     14   17   2   3   46
QA2    8    1     14   0    5   1   29
QA3    1    1      7   0    0   1   10
Total 18    3     35   17   7   5   85

我已经准备好报告,直到
    Enviro Requi  Dev  TSc  TD Unkn 
QA1    9    1     14    17   2  3   
QA2    8    1     14    0    5  1   
QA3    1    1      7    0    0  1   

我使用下面的查询来得到上面的结果
select *
from
(
  select environment_name as " ", value
  from test1 
  unpivot
  (
     value
    for col in (root_cause)
  ) unp
) src
pivot
(
  count(value)
  for value in ([Enviro] , [Requi] , [Dev] , [Tsc], [TD] , [Unkn])
) piv

任何人都可以帮助获得列和行的总数吗?

最佳答案

对此可能有多种方法。您可以在枢轴之后计算所有总数,也可以先获取总数,然后再对所有结果进行枢轴运算。也可能有一种中间立场:获得一种总数(例如行式总数),枢轴,然后获得另一种,尽管这可能会做得过火。

提到的第一种方法,在枢轴之后获取所有总数,可以以非常简单的方式完成,并且在下面的实现中唯一可能对您来说是新的东西可能是 GROUP BY ROLLUP() :

SELECT
  [ ]      = ISNULL(environment_name, 'Total'),
  [Enviro] = SUM([Enviro]),
  [Requi]  = SUM([Requi]),
  [Dev]    = SUM([Dev]),
  [Tsc]    = SUM([Tsc]),
  [TD]     = SUM([TD]),
  [Unkn]   = SUM([Unkn]),
  Total    = SUM([Enviro] + [Requi] + [Dev] + [Tsc] + [TD] + [Unkn])
FROM (
  SELECT environment_name, root_cause
  FROM test1
) s
PIVOT (
  COUNT(root_cause)
  FOR root_cause IN ([Enviro], [Requi], [Dev], [Tsc], [TD], [Unkn])
) p
GROUP BY
  ROLLUP(environment_name)
;

基本上,GROUP BY ROLLUP() part 为您生成 Total 行。分组首先由 environment_name 完成,然后添加总计行。

做相反的事情,即在旋转之前获得总数,您可以使用 GROUP BY CUBE()像这样:
SELECT
  [ ]      = environment_name,
  [Enviro] = ISNULL([Enviro], 0),
  [Requi]  = ISNULL([Requi] , 0),
  [Dev]    = ISNULL([Dev]   , 0),
  [Tsc]    = ISNULL([Tsc]   , 0),
  [TD]     = ISNULL([TD]    , 0),
  [Unkn]   = ISNULL([Unkn]  , 0),
  Total    = ISNULL(Total   , 0)
FROM (
  SELECT
    environment_name = ISNULL(environment_name, 'Total'),
    root_cause       = ISNULL(root_cause,       'Total'),
    cnt              = COUNT(*)
  FROM test1
  WHERE root_cause IS NOT NULL
  GROUP BY
    CUBE(environment_name, root_cause)
) s
PIVOT (
  SUM(cnt)
  FOR root_cause IN ([Enviro], [Requi], [Dev], [Tsc], [TD], [Unkn], Total)
) p
;

这两种方法都可以在 SQL Fiddle 中测试和使用:
  • Method 1
  • Method 2

  • 注意。我在两个建议中都省略了取消旋转步骤,因为取消旋转单个列似乎显然是多余的。但是,如果还有更多内容,调整任一查询应该很容易。

    关于sql - 在 sql server 2008 中使用带有列和行总数的数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17140559/

    相关文章:

    Javascript - 将元素添加到具有固定值的查询结果的最佳/最快方法

    mysql插入+选择row_id

    SQL Pivot 具有不同数量的行和复合键来形成列

    php - Laravel SQL 无法创建表

    c++ - 在不使用MySQL的INSERT关键字的情况下使用C在MySQL中的表中插入一行

    sql-server - SQL 服务器 : create view if not exists don't work

    sql - 查询从年初开始每周的总计

    sql - 无法在 EXEC() 后获得 @@ERROR 并出现错误

    mysql - 根据条件将行转为列

    sql - 在oracle中将行拆分为列