简体   繁体   English

在数据透视表中设置交叉表的格式

[英]Format cross tabs in a pivot table

I have this query that pivots race grouped by age 我有此查询可按年龄分组种族

        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

and when I run it I get this 当我运行它时,我得到了

1个

but what I need is this, without the age ranges. 但是我需要的是这个,没有年龄范围。

1个

I am going to be putting the pivot in a Radgrid with a custom header that will display the age ranges so they will not be needed in the column headers. 我将把数据透视表放在带有自定义标题的Radgrid中,该标题将显示年龄范围,因此在列标题中将不需要它们。 Is this possible? 这可能吗? Thanks in advance 提前致谢

I'm not really sure whether you want the age ranges collapsed into a single column, or if you want the same column names repeated in your query. 我不确定是否要将年龄范围折叠到单个列中,还是要在查询中重复相同的列名。 If you want them collapsed: 如果要让它们折叠:

http://sqlfiddle.com/#!3/f0ca0/3 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

If you really want the same columns names returned multiple times, I think you're really asking for a headache. 如果您确实希望多次返回相同的列名,那么我想您真的很头疼。 This is the closest I can offer (although it isn't that great of a solution, since it doesn't do much beyond your base setup): 这是我能提供的最接近的方法(尽管它不是一个很好的解决方案,因为它在您的基本设置之外没有什么用):

http://sqlfiddle.com/#!3/f0ca0/5 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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM