Форматирование кросс-таблиц в сводной таблице - PullRequest
0 голосов
/ 06 марта 2012

У меня есть этот запрос, который объединяет расы, сгруппированные по возрасту

        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://img834.imageshack.us/img834/8808/sqlnow.jpg

, но мне нужноэто без диапазонов возраста.

1 http://img716.imageshack.us/img716/1462/sqllater.jpg

Я собираюсь поместить сводную таблицу в Radgrid с настраиваемым заголовком, который будет отображать диапазоны возраста, поэтому они не будутнеобходимо в заголовках столбцов.Это возможно?Заранее спасибо

1 Ответ

0 голосов
/ 06 марта 2012

Я не совсем уверен, хотите ли вы, чтобы возрастные диапазоны были сведены в один столбец или если вы хотите, чтобы одинаковые имена столбцов повторялись в вашем запросе. Если вы хотите, чтобы они рухнули:

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