简体   繁体   中英

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. 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

    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

    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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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