【问题标题】:Format cross tabs in a pivot table格式化数据透视表中的交叉表
【发布时间】:2012-03-06 03:42:15
【问题描述】:

我有这个查询以按年龄分组的种族

        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

当我运行它时,我得到了这个

但我需要的是这个,没有年龄范围。

我将把枢轴放在带有自定义标题的 Radgrid 中,该标题将显示年龄范围,因此列标题中不需要它们。这可能吗? 提前致谢

【问题讨论】:

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


    【解决方案1】:

    我不确定您是否希望将年龄范围合并到单个列中,或者是否希望在查询中重复相同的列名。如果您希望它们折叠起来:

    http://sqlfiddle.com/#!3/f0ca0/3

        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  
          P.city,
          P.sex,
          [20-30_African-American] + [31-40_African-American] + [41-50_African-American] as [African-American],
    
          [20-30_Asian] + [31-40_Asian] + [41-50_Asian] as [Asian],
    
          [20-30_Caucasian] + [31-40_Caucasian] + [41-50_Caucasian] as [Caucasian],
    
          [20-30_Hispanic] + [31-40_Hispanic] + [41-50_Hispanic] as [Hispanic]
       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
    

    如果您真的希望多次返回相同的列名,我认为您真的很头疼。这是我能提供的最接近的解决方案(虽然它不是一个很好的解决方案,因为它并没有超出你的基本设置):

    http://sqlfiddle.com/#!3/f0ca0/5

        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  
          P.city,
          P.sex,
              [20-30_African-American] as [African-American1], 
              [20-30_Asian] as [Asian1], 
              [20-30_Caucasian] as [Caucasian1], 
              [20-30_Hispanic] as [Hispanic1],
              [31-40_African-American] as [African-American2], 
              [31-40_Asian] as [Asian2], 
              [31-40_Caucasian] as [Caucasian2], 
              [31-40_Hispanic] as [Hispanic2],
              [41-50_African-American] as [African-American3], 
              [41-50_Asian] as [Asian3], 
              [41-50_Caucasian] as [Caucasian3], 
              [41-50_Hispanic] as [Hispanic3]
    
       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
    

    【讨论】:

    • 顺便说一句 - 我是 sqlfiddle.com 的开发者
    • 感谢您的回复,感谢您的帮助,但如果可能的话,我确实需要多次返回相同的列名。
    • 好吧,我假设您必须计划通过它们在结果集中的位置而不是它们的名称来消除列的歧义。在这种情况下 - 只需从我的第二个示例中的列别名中删除尾随数字,这应该是你想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多