2012-02-19 13 views
3

2つのクロスタブと複数の列を持つテーブルを作成しようとしています。私はこれまでのところ、これを持っている、と私はそれを実行したときに2つのクロスタブと複数の列を持つ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

を得る。しかし、私は必要なの上部と複数の列のためのオプションの2つのクロスタブで、これです。

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

は、ピボットまたは他のソリューションで、このことは可能ですか?事前

+0

賛辞のために –

+0

年齢のオーバーラップが境界線に本当に欲しいですか?または20~29,30~39,40~49の群から選択される少なくとも1種である。 – tawman

+0

はい、20から29,30から39、40から49です。ありがとうございます – user973671

答えて

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

+0

これは良いですが、実際にこの正確な結果を作成することは可能です。二番目に?ありがとうございました – user973671

+0

@ user973671 - あなたの質問に答えるために、これはSQLではなく、アプリケーションまたはレポートフレームワークによって処理されるべきであるというプレゼンテーション上の懸念事項です(リンク先はhttp://www.realestateagenthealthinsurance.com/images/333.jpg)。 。 SQLはレイアウトやレポート書式ではなくデータを取得するためのものです:) –

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 - 私はあなた自身が巧妙なアプローチであると思った: –

+0

@JCooperありがとう! – tawman

関連する問題