我有一个包含以下列的表格
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 中测试和使用:
注意。我在两个建议中都省略了取消旋转步骤,因为取消旋转单个列似乎显然是多余的。但是,如果还有更多内容,调整任一查询应该很容易。
关于sql - 在 sql server 2008 中使用带有列和行总数的数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17140559/