我正在尝试在分组函数中使用汇总和case语句创建一个数据透视表。当数据透视表的列部分中的数据不需要更改时,我的查询效果很好,
他就是一个例子。
http://sqlfiddle.com/#!3/3143e/2
但是当我需要在列部分中有一个case语句时,它就会混乱。例如,其中一列需要返回
“1 of 3” if someone voted in one of three elections,
“2 of 3” if someone voted in two of three elections,
“3 of 3” if someone voted in three of three elections,
这是案例陈述
CAST( (CASE WHEN election1 IS NOT NULL THEN 1 ELSE 0 END)
+(CASE WHEN election2 IS NOT NULL THEN 1 ELSE 0 END)
+(CASE WHEN election3 IS NOT NULL THEN 1 ELSE 0 END) AS CHAR(1)) + '-3' as election
我需要帮助弄清楚如何将这个case语句放在Grouping()函数中,或者可能有不同的方法来执行此操作。我试过这样的事情
http://sqlfiddle.com/#!3/3143e/3
但当然没有用。 这就是最终的支点应该是什么样的
1 http://img842.imageshack.us/img842/6884/84834931.jpg
提前致谢
答案 0 :(得分:0)
所以我有一个建议给你。我是以另一种方式做到的,但它确实有效。
测试数据
create table test4(city nvarchar(10), race nvarchar(30), sex nvarchar(10), age int, type nvarchar(30),election1 nvarchar(30), election2 nvarchar(30), election3 nvarchar(30),)
insert into test4 values ('Austin', 'African-American', 'male', 21, 'gv','G10','G08','G06')
insert into test4 values ('Austin', 'Asian', 'female', 22,'AV',null,'G08','G06')
insert into test4 values ('Austin', 'Caucasian', 'male', 23,'BV','G10',null,null)
insert into test4 values ('Austin', 'Hispanic', 'female', 24,'AV','G10','G08','G06')
insert into test4 values ('Austin', 'African-American', 'Unknown', 25,'CV','G10','G08',null)
insert into test4 values ('Austin', 'Asian', 'male', 26,'gv',null,'G08','G06')
insert into test4 values ('Austin', 'Caucasian', 'female', 27,'CV',null,'G08','G06')
insert into test4 values ('Austin', 'Hispanic', 'Unknown', 28,'AV',null,'G08','G06')
insert into test4 values ('Austin', 'Asian', 'male', 29,'BV','G10',null,'G06')
insert into test4 values ('Austin', 'Caucasian', 'female', 31,'gv','G10',null,'G06')
insert into test4 values ('Dallas', 'Hispanic', 'Unknown', 32,'BV','G10',null,'G06')
insert into test4 values ('Dallas', 'African-American', 'male', 33,'gv','G10',null,'G06')
insert into test4 values ('Dallas', 'Asian', 'female', 34,'BV',null,'G08','G06')
insert into test4 values ('Dallas', 'Caucasian', 'Unknown', 35,'AV',null,null,null)
insert into test4 values ('Dallas', 'Hispanic', 'male', 500,'AV',null,'G08',null)
insert into test4 values ('Dallas', 'African-American', 'female', 36,'AV','G10',null,'G06')
insert into test4 values ('Dallas', 'Asian', 'Unknown', 37,'CV','G10','G08',null)
insert into test4 values ('Dallas', 'Caucasian', 'male', 38,'CV',null,null,null)
insert into test4 values ('Dallas', 'Hispanic', 'female', 39,'gv','G10','G08','G06')
insert into test4 values ('Dallas', 'African-American', 'Unknown', 41,'CV',null,'G08','G06')
insert into test4 values ('Houston', 'Asian', 'male', 42,'BV',null,'G08',null)
insert into test4 values ('Houston', 'Caucasian', 'female', 43,'CV','G10',null,'G06')
insert into test4 values ('Houston', 'Hispanic', 'Unknown', 44,'BV','G10',null,'G06')
insert into test4 values ('Houston', 'African-American', 'male', 45,'CV',null,'G08','G06')
insert into test4 values ('Houston', 'Asian', 'female', 46,'CV','G10','G08','G06')
insert into test4 values ('Houston', 'Caucasian', 'Unknown', 47,'gv',null,null,null)
insert into test4 values ('Houston', 'Hispanic', 'male', 48,'AV','G10','G08',null)
insert into test4 values ('Houston', 'African-American', 'female', 49,'gv','G10',null,'G06')
insert into test4 values ('Houston', 'Asian', 'Unknown', 51,'BV',null,'G08',null)
insert into test4 values ('Houston', 'Caucasian', 'male', 52,'AV',null,'G08','G06');
PIVOT
UNION ALL
;WITH PivotTable
AS
(
SELECT
pvt.city,
pvt.sex,
pvt.election,
ISNULL(pvt.[20_30_Af],0) AS [20_30_Af],
ISNULL(pvt.[20_30_As],0) AS [20_30_As],
ISNULL(pvt.[20_30_C],0) AS [20_30_C],
ISNULL(pvt.[20_30_H],0) AS [20_30_H],
ISNULL(pvt.[30_40_Af],0) AS [30_40_Af],
ISNULL(pvt.[30_40_As],0) AS [30_40_As],
ISNULL(pvt.[30_40_C],0) AS [30_40_C],
ISNULL(pvt.[30_40_H],0) AS [30_40_H],
ISNULL(pvt.[40_50_Af],0) AS [40_50_Af],
ISNULL(pvt.[40_50_As],0) AS [40_50_As],
ISNULL(pvt.[40_50_C],0) AS [40_50_C],
ISNULL(pvt.[40_50_H],0) AS [40_50_H]
FROM
(
SELECT
(
case
when race = 'African-American' and age between 21 and 30
then '20_30_Af'
when race = 'Asian' and age between 21 and 30
then '20_30_As'
when race = 'Caucasian' and age between 21 and 30
then '20_30_C'
when race = 'Hispanic' and age between 21 and 30
then '20_30_H'
when race = 'African-American' and age between 31 and 40
then '30_40_Af'
when race = 'Asian' and age between 31 and 40
then '30_40_As'
when race = 'Caucasian' and age between 31 and 40
then '30_40_C'
when race = 'Hispanic' and age between 31 and 40
then '30_40_H'
when race = 'African-American' and age between 41 and 50
then '40_50_Af'
when race = 'Asian' and age between 41 and 50
then '40_50_As'
when race = 'Caucasian' and age between 41 and 50
then '40_50_C'
when race = 'Hispanic' and age between 41 and 50
then '40_50_H'
end
) AS pivotText,
1 as pivotNbr,
test4.city,
test4.sex,
CAST( (CASE WHEN election1 IS NOT NULL THEN 1 ELSE 0 END)
+(CASE WHEN election2 IS NOT NULL THEN 1 ELSE 0 END)
+(CASE WHEN election3 IS NOT NULL THEN 1 ELSE 0 END) AS CHAR(1))
+ '-3' as election
FROM
test4
) AS p
PIVOT
(
SUM(pivotNbr)
FOR pivotText IN([20_30_Af],[20_30_As],
[20_30_C],[20_30_H],[30_40_Af],
[30_40_As],[30_40_C],[30_40_H],
[40_50_Af],[40_50_As],[40_50_C],[40_50_H])
) AS pvt
)
SELECT
PivotTable.city,
PivotTable.sex,
PivotTable.election,
PivotTable.[20_30_Af],
PivotTable.[20_30_As],
PivotTable.[20_30_C],
PivotTable.[20_30_H],
PivotTable.[30_40_Af],
PivotTable.[30_40_As],
PivotTable.[30_40_C],
PivotTable.[30_40_H],
PivotTable.[40_50_Af],
PivotTable.[40_50_As],
PivotTable.[40_50_C],
PivotTable.[40_50_H],
(
PivotTable.[20_30_Af]+
PivotTable.[20_30_As]+
PivotTable.[20_30_C]+
PivotTable.[20_30_H]+
PivotTable.[30_40_Af]+
PivotTable.[30_40_As]+
PivotTable.[30_40_C]+
PivotTable.[30_40_H]+
PivotTable.[40_50_Af]+
PivotTable.[40_50_As]+
PivotTable.[40_50_C]+
PivotTable.[40_50_H]
) AS Total,
null as isGrandTotal,
2 AS sortOrder
FROM
PivotTable
UNION ALL
SELECT
PivotTable.city,
'' AS sex,
'' AS election,
SUM(PivotTable.[20_30_Af]) AS [20_30_Af],
SUM(PivotTable.[20_30_As]) AS [20_30_As],
SUM(PivotTable.[20_30_C]) AS [20_30_C],
SUM(PivotTable.[20_30_H]) AS [20_30_H],
SUM(PivotTable.[30_40_Af]) AS [30_40_Af],
SUM(PivotTable.[30_40_As]) AS [30_40_As],
SUM(PivotTable.[30_40_C]) AS [30_40_C],
SUM(PivotTable.[30_40_H]) AS [30_40_H],
SUM(PivotTable.[40_50_Af]) AS [40_50_Af],
SUM(PivotTable.[40_50_As]) AS [40_50_As],
SUM(PivotTable.[40_50_C]) AS [40_50_C],
SUM(PivotTable.[40_50_H]) AS [40_50_H],
SUM(
PivotTable.[20_30_Af]+
PivotTable.[20_30_As]+
PivotTable.[20_30_C]+
PivotTable.[20_30_H]+
PivotTable.[30_40_Af]+
PivotTable.[30_40_As]+
PivotTable.[30_40_C]+
PivotTable.[30_40_H]+
PivotTable.[40_50_Af]+
PivotTable.[40_50_As]+
PivotTable.[40_50_C]+
PivotTable.[40_50_H]
) AS Total,
null as isGrandTotal,
1 AS sortOrder
FROM
PivotTable
GROUP BY
PivotTable.city
UNION ALL
SELECT
'Grand Total' AS city,
'' AS sex,
'' AS election,
SUM(PivotTable.[20_30_Af]) AS [20_30_Af],
SUM(PivotTable.[20_30_As]) AS [20_30_As],
SUM(PivotTable.[20_30_C]) AS [20_30_C],
SUM(PivotTable.[20_30_H]) AS [20_30_H],
SUM(PivotTable.[30_40_Af]) AS [30_40_Af],
SUM(PivotTable.[30_40_As]) AS [30_40_As],
SUM(PivotTable.[30_40_C]) AS [30_40_C],
SUM(PivotTable.[30_40_H]) AS [30_40_H],
SUM(PivotTable.[40_50_Af]) AS [40_50_Af],
SUM(PivotTable.[40_50_As]) AS [40_50_As],
SUM(PivotTable.[40_50_C]) AS [40_50_C],
SUM(PivotTable.[40_50_H]) AS [40_50_H],
SUM(
PivotTable.[20_30_Af]+
PivotTable.[20_30_As]+
PivotTable.[20_30_C]+
PivotTable.[20_30_H]+
PivotTable.[30_40_Af]+
PivotTable.[30_40_As]+
PivotTable.[30_40_C]+
PivotTable.[30_40_H]+
PivotTable.[40_50_Af]+
PivotTable.[40_50_As]+
PivotTable.[40_50_C]+
PivotTable.[40_50_H]
) AS Total,
1 as isGrandTotal,
3 AS sortOrder
FROM
PivotTable
ORDER BY
isGrandTotal,
city,
sortOrder