2012-03-06 210 views
0

我有这个疑问而转动的比赛按年龄格式交叉表

 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控件与自定义标题,将显示的年龄范围,使他们不会在列标题是必要的。这可能吗? 在此先感谢

回答

0

我不确定是要将年龄段合并为单个列,还是希望在查询中重复使用相同的列名。如果你希望他们崩溃了:

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 
+0

顺便说一句 - 我是开发商sqlfiddle.com – 2012-03-06 06:51:32

+0

感谢您的回复,我感谢您的帮助,但如果可能,我真的需要多次返回相同的列名。 – user973671 2012-03-06 14:09:42

+0

那么,我假设你必须计划通过在结果集中的位置而不是他们的名字对列进行消歧。在这种情况下 - 只需从第二个示例中的列别名中删除尾部数字,这应该是你想要的。 – 2012-03-06 23:06:44