【问题标题】:SQL pivot table with column and row totals具有列和行总计的 SQL 数据透视表
【发布时间】:2012-03-24 14:35:09
【问题描述】:

我正在尝试将行和列总计添加到此数据透视表中

      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

我正在努力实现这个结果

我可以在 Google 上找到的唯一示例是为 SQL 2000 编写的存储过程。请帮助!提前致谢

【问题讨论】:

标签: sql sql-server-2008 pivot-table


【解决方案1】:

你试试看。

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

【讨论】:

  • 这太完美了,非常感谢。
  • 它真的很简单很好,但是我们可以修改它的参数吗?能够与动态列一起使用。
【解决方案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

【讨论】:

  • 这很好,但如果可能的话,我还需要底部列的总数,谢谢
  • 那么你需要将这些结果保存到临时表中。之后,make 是 union script.. select 'Total','', sum([20-30_African-American]) 等
  • 你能举个例子吗?对不起,我没有完全理解。谢谢
猜你喜欢
  • 2023-04-04
  • 2018-12-31
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 2017-05-27
  • 2021-06-29
相关资源
最近更新 更多