2012-02-19 61 views
3

我想建立一个具有两个交叉选项卡和多列的表。我有这个迄今为止,当我运行它Sql与两个交叉选项卡和多列的数据透视表

create table test2(city nvarchar(10), race nvarchar(30), sex nvarchar(10), age int) 
    insert into test2 values ('Austin', 'African-American', 'male', 21) 
    insert into test2 values ('Austin', 'Asian', 'female', 22) 
    insert into test2 values ('Austin', 'Caucasian', 'male', 23) 
    insert into test2 values ('Austin', 'Hispanic', 'female', 24) 
    insert into test2 values ('Austin', 'African-American', 'Unknown', 25) 
    insert into test2 values ('Austin', 'Asian', 'male', 26) 
    insert into test2 values ('Austin', 'Caucasian', 'female', 27) 
    insert into test2 values ('Austin', 'Hispanic', 'Unknown', 28) 
    insert into test2 values ('Austin', 'Asian', 'male', 29) 
    insert into test2 values ('Austin', 'Caucasian', 'female', 31) 
    insert into test2 values ('Dallas', 'Hispanic', 'Unknown', 32) 
    insert into test2 values ('Dallas', 'African-American', 'male', 33) 
    insert into test2 values ('Dallas', 'Asian', 'female', 34) 
    insert into test2 values ('Dallas', 'Caucasian', 'Unknown', 35) 
    insert into test2 values ('Dallas', 'Hispanic', 'male', 500) 
    insert into test2 values ('Dallas', 'African-American', 'female', 36) 
    insert into test2 values ('Dallas', 'Asian', 'Unknown', 37) 
    insert into test2 values ('Dallas', 'Caucasian', 'male', 38) 
    insert into test2 values ('Dallas', 'Hispanic', 'female', 39) 
    insert into test2 values ('Dallas', 'African-American', 'Unknown', 41) 
    insert into test2 values ('Houston', 'Asian', 'male', 42) 
    insert into test2 values ('Houston', 'Caucasian', 'female', 43) 
    insert into test2 values ('Houston', 'Hispanic', 'Unknown', 44) 
    insert into test2 values ('Houston', 'African-American', 'male', 45) 
    insert into test2 values ('Houston', 'Asian', 'female', 46) 
    insert into test2 values ('Houston', 'Caucasian', 'Unknown', 47) 
    insert into test2 values ('Houston', 'Hispanic', 'male', 48) 
    insert into test2 values ('Houston', 'African-American', 'female', 49) 
    insert into test2 values ('Houston', 'Asian', 'Unknown', 51) 
    insert into test2 values ('Houston', 'Caucasian', 'male', 52) 

    SELECT * 
    FROM 
    (
    SELECT a.city, a.sex 
    FROM [AdventureWorksDW].[dbo].[test2] a 

    ) p 
    PIVOT 
    (
    COUNT (sex) 
    FOR sex 
    IN ([male], [female], [Unknown]) 
    ) AS pvt 

我得到这个

s http://realestateagenthealthinsurance.com/images/111.jpg

但我需要的就是这一点,与前两名交叉表和多个列的选项。

s http://realestateagenthealthinsurance.com/images/222.jpg

这可能与一个枢轴或任何其他解决方案? 在此先感谢

+0

荣誉的提供样本数据脚本和图片 – 2012-02-19 04:56:08

+0

您是否真的想要在界限上重叠年龄?或第20至29,30至39和40至49组? – tawman 2012-02-19 05:08:31

+0

是的,你是正确的20至29,30至39和40至49.谢谢 – user973671 2012-02-19 05:11:47

回答

2
WITH T AS (
    SELECT A.city, 
      A.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 @test2 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 
ORDER BY city, sex 
+1

我喜欢这个比我的+1更好..替换@ test2 w/test2让它对样品运行 – tawman 2012-02-19 05:25:59

+0

这很好,但是有可能实际创建这个确切的结果,在第一排和比赛中的年龄第二? [链接](http://www.realestateagenthealthinsurance.com/images/333.jpg),谢谢 – user973671 2012-02-19 05:38:51

+0

@ user973671 - 回答你的问题,这是一个应该由应用程序或报告框架处理的表象问题,而不是SQL 。 SQL是用于检索数据,而不是布局和报表格式:) – 2012-02-19 05:43:50

2

您可以为每个3个年龄组的运行单独的PIVOT查询,然后外连接的结果,城市和性别存在的查询:

WITH DataKeys AS (
    select distinct city, sex 
    from test2), 
Data20to29 AS (
    SELECT * 
    FROM(SELECT * FROM test2 WHERE age between 20 and 29 
    ) AS Age20to29 
    PIVOT (COUNT(age) 
      FOR race IN ([African-American], [Asian], [Caucasian], [Hispanic]) 
    ) as Data20to29), 
Data30to39 AS (
    SELECT * 
    FROM(SELECT * FROM test2 WHERE age between 30 and 39 
    ) AS Age30to39 
    PIVOT (COUNT(age) 
      FOR race IN ([African-American], [Asian], [Caucasian], [Hispanic]) 
    ) as Data30to39), 
Data40to49 AS (
    SELECT * 
    FROM(SELECT * FROM test2 WHERE age between 40 and 49 
    ) AS Age40to49 
    PIVOT (COUNT(age) 
      FOR race IN ([African-American], [Asian], [Caucasian], [Hispanic]) 
    ) as Data40to49) 
SELECT SELECT k.city, k.sex, 
    d20.[African-American], d20.Asian, d20.Caucasian, d20.Hispanic, 
    d30.[African-American], d30.Asian, d30.Caucasian, d30.Hispanic, 
    d40.[African-American], d40.Asian, d40.Caucasian, d40.Hispanic 
FROM DataKeys k LEFT JOIN Data20to29 d20 ON d20.city = k.city AND d20.sex = k.sex 
LEFT JOIN Data30to39 d30 ON d30.city = k.city AND d30.sex = k.sex 
LEFT JOIN Data40to49 d40 ON d40.city = k.city AND d40.sex = k.sex 
ORDER BY k.city, k.sex 
+0

+1 - 我以为你自己是一个聪明的方法:) – 2012-02-19 05:28:37

+0

@JCooper谢谢! – tawman 2012-02-19 05:30:01