2012-03-07 113 views
3

在我试图行和列总计添加到该数据透视表SQL数据透视表总计

 create table test4(city nvarchar(10), race nvarchar(30), sex nvarchar(10), age int) 
      insert into test4 values ('Austin', 'African-American', 'male', 21) 
      insert into test4 values ('Austin', 'Asian', 'female', 22) 
      insert into test4 values ('Austin', 'Caucasian', 'male', 23) 
      insert into test4 values ('Austin', 'Hispanic', 'female', 24) 
      insert into test4 values ('Austin', 'African-American', 'Unknown', 25) 
      insert into test4 values ('Austin', 'Asian', 'male', 26) 
      insert into test4 values ('Austin', 'Caucasian', 'female', 27) 
      insert into test4 values ('Austin', 'Hispanic', 'Unknown', 28) 
      insert into test4 values ('Austin', 'Asian', 'male', 29) 
      insert into test4 values ('Austin', 'Caucasian', 'female', 31) 
      insert into test4 values ('Dallas', 'Hispanic', 'Unknown', 32) 
      insert into test4 values ('Dallas', 'African-American', 'male', 33) 
      insert into test4 values ('Dallas', 'Asian', 'female', 34) 
      insert into test4 values ('Dallas', 'Caucasian', 'Unknown', 35) 
      insert into test4 values ('Dallas', 'Hispanic', 'male', 500) 
      insert into test4 values ('Dallas', 'African-American', 'female', 36) 
      insert into test4 values ('Dallas', 'Asian', 'Unknown', 37) 
      insert into test4 values ('Dallas', 'Caucasian', 'male', 38) 
      insert into test4 values ('Dallas', 'Hispanic', 'female', 39) 
      insert into test4 values ('Dallas', 'African-American', 'Unknown', 41) 
      insert into test4 values ('Houston', 'Asian', 'male', 42) 
      insert into test4 values ('Houston', 'Caucasian', 'female', 43) 
      insert into test4 values ('Houston', 'Hispanic', 'Unknown', 44) 
      insert into test4 values ('Houston', 'African-American', 'male', 45) 
      insert into test4 values ('Houston', 'Asian', 'female', 46) 
      insert into test4 values ('Houston', 'Caucasian', 'Unknown', 47) 
      insert into test4 values ('Houston', 'Hispanic', 'male', 48) 
      insert into test4 values ('Houston', 'African-American', 'female', 49) 
      insert into test4 values ('Houston', 'Asian', 'Unknown', 51) 
      insert into test4 values ('Houston', 'Caucasian', 'male', 52); 

      WITH T AS (
      SELECT 
        A.city as city, A.sex as sex, 
        CASE 
         WHEN A.age BETWEEN 20 AND 30 THEN '20-30_' + race 
         WHEN A.age BETWEEN 31 AND 40 THEN '31-40_' + race 
         WHEN A.age BETWEEN 41 AND 50 THEN '41-50_' + race 
        END AS age_range_race 
      FROM test4 AS A 
      ) 
      SELECT * 
      FROM T 
      PIVOT(COUNT(age_range_race) FOR age_range_race 
       IN(
        [20-30_African-American], 
        [20-30_Asian], 
        [20-30_Caucasian], 
        [20-30_Hispanic], 
        [31-40_African-American], 
        [31-40_Asian], 
        [31-40_Caucasian], 
        [31-40_Hispanic], 
        [41-50_African-American], 
        [41-50_Asian], 
        [41-50_Caucasian], 
        [41-50_Hispanic] 
       ) 
      ) AS P 

我想实现这个结果

1 http://img853.imageshack.us/img853/8112/sqltotal.jpg

唯一的例子我可以在Google上找到为SQL 2000编写的存储过程。请帮忙!在此先感谢

+1

你的脚本正在工作,对吗? – 2012-03-07 03:25:52

+1

是的,我只是想创造总数。 – user973671 2012-03-07 03:28:28

+1

[你可以小计数据透视表中的行和/或列吗?](http://stackoverflow.com/questions/7925748/can-you-subtotal-rows-and-or-columns-in-a- pivot-table) – bummi 2014-12-01 09:31:37

回答

8

在这里,你试试。

WITH T AS (
      SELECT 
        A.city as city, A.sex as sex, 
        CASE 
         WHEN A.age BETWEEN 20 AND 30 THEN '20-30_' + race 
         WHEN A.age BETWEEN 31 AND 40 THEN '31-40_' + race 
         WHEN A.age BETWEEN 41 AND 50 THEN '41-50_' + race 
        END AS age_range_race 
      FROM #test4 AS A 
      ) 


SELECT *, ([20-30_African-American] + [20-30_Asian] + [20-30_Caucasian]+ [20-30_Hispanic]+ [31-40_African-American]+ [31-40_Asian]+ [31-40_Caucasian]+ [31-40_Hispanic]+[41-50_African-American]+ [41-50_Asian]+ [41-50_Caucasian]+ [41-50_Hispanic]) Total 
into #tmp_result 
FROM T 
PIVOT(COUNT(age_range_race) FOR age_range_race 
    IN(
     [20-30_African-American], 
     [20-30_Asian], 
     [20-30_Caucasian], 
     [20-30_Hispanic], 
     [31-40_African-American], 
     [31-40_Asian], 
     [31-40_Caucasian], 
     [31-40_Hispanic], 
     [41-50_African-American], 
     [41-50_Asian], 
     [41-50_Caucasian], 
     [41-50_Hispanic] 
    ) 
) AS P 

select * 
from #tmp_result 
union all 
select 'Grand Total','',SUM([20-30_African-American]), SUM([20-30_Asian]), SUM([20-30_Caucasian]), SUM([20-30_Hispanic]),SUM([31-40_African-American]), SUM([31-40_Asian]), SUM([31-40_Caucasian]), SUM([31-40_Hispanic]),SUM([41-50_African-American]), SUM([41-50_Asian]), SUM([41-50_Caucasian]),SUM([41-50_Hispanic]), sum(Total) 
from #tmp_result 
+1

这很完美,非常感谢。 – user973671 2012-03-07 15:02:01

+1

其真的很简单,但我们可以修改它的参数吗?能够与动态列一起使用。 – Rapunzo 2013-03-06 09:33:00

2

请尝试如下..

WITH T AS (
      SELECT 
        A.city as city, A.sex as sex, 
        CASE 
         WHEN A.age BETWEEN 20 AND 30 THEN '20-30_' + race 
         WHEN A.age BETWEEN 31 AND 40 THEN '31-40_' + race 
         WHEN A.age BETWEEN 41 AND 50 THEN '41-50_' + race 
        END AS age_range_race 
      FROM #test4 AS A 
      ) 


SELECT *, ([20-30_African-American] + [20-30_Asian] + [20-30_Caucasian]+ [20-30_Hispanic]+ [31-40_African-American]+ [31-40_Asian]+ [31-40_Caucasian]+ [31-40_Hispanic]+[41-50_African-American]+ [41-50_Asian]+ [41-50_Caucasian]+ [41-50_Hispanic]) Total 
FROM T 
PIVOT(COUNT(age_range_race) FOR age_range_race 
    IN(
     [20-30_African-American], 
     [20-30_Asian], 
     [20-30_Caucasian], 
     [20-30_Hispanic], 
     [31-40_African-American], 
     [31-40_Asian], 
     [31-40_Caucasian], 
     [31-40_Hispanic], 
     [41-50_African-American], 
     [41-50_Asian], 
     [41-50_Caucasian], 
     [41-50_Hispanic] 
    ) 
) AS P 
+1

这很好,但如果可能的话,我还需要底部的列,谢谢 – user973671 2012-03-07 03:42:19

+1

然后您需要将这些结果保存在临时表中。之后,make是联合脚本..选择'Total','',sum([20-30_African-American])等 – 2012-03-07 03:48:31

+1

你能提供一个例子吗?对不起,我完全不理解它。谢谢 – user973671 2012-03-07 03:57:35