【问题标题】:Sql Pivot table with two cross tab and multiple columns具有两个交叉表和多列的 Sql Pivot 表
【发布时间】:2012-03-09 22:37:29
【问题描述】:

我正在尝试构建一个包含两个交叉表和多个列的表。到目前为止,我有这个,当我运行它时

    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

我明白了


(来源:realestateagenthealthinsurance.com

但我需要的是这个,顶部有两个交叉表和一个用于多列的选项。


(来源:realestateagenthealthinsurance.com

这可以通过枢轴或任何其他解决方案实现吗? 提前致谢

【问题讨论】:

  • 感谢提供示例数据脚本和图片
  • 您真的想在边界上重叠年龄吗?还是第 20 到 29、30 到 39 和 40 到 49 组?
  • 是的,你是对的 20 到 29、30 到 39 和 40 到 49。谢谢
  • @user973671 将 30 岁和 40 岁分成两组?您的标题重叠边界。 20 到 29 岁是十人一组:)

标签: sql sql-server-2008 pivot crosstab


【解决方案1】:
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 更喜欢这个 .. 用 test2 替换 @test2 以使其对样本运行
  • 这很好,但是否可以实际创建这个精确的结果,第一行是年龄,第二行是种族? link,谢谢
  • @user973671 - 回答您的问题,这是一个应由应用程序或报告框架处理的表示问题,而不是 SQL。 SQL 用于检索数据,而不是布局和报告格式 :)
  • 这让我想起了前几天我回答的一个关于“多级”列标题的问题:stackoverflow.com/questions/9280724/sql-multi-layer-headers/…
  • 这就是我的想法,只是想知道是否可能。但是,如果有人知道如何使用 SQL 使其格式像这样,请发布。 J Cooper 和 tawman 你们都回答了我的问题。谢谢
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    相关资源
    最近更新 更多