具有两个交叉表和多列的 Sql 数据透视表

发布于 2025-01-07 12:23:32 字数 3067 浏览 4 评论 0原文

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

    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
(来源:realestateagenthealthinsurance.com

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

s
(来源:realestateagenthealthinsurance.com

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

I am trying to build a table with two cross tabs and multiple columns. I have this so far, and when I run it

    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

I get this

s
(source: realestateagenthealthinsurance.com)

But what I need is this, with two cross tabs on top and a option for multiple columns.

s
(source: realestateagenthealthinsurance.com)

Is this possible with a pivot or any other solution?
Thanks in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

空名 2025-01-14 12:23:32
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
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
鹤舞 2025-01-14 12:23:32

您可以为 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

You can run a separate PIVOT query for each of the 3 age groups, and then outer join the results to a query of the city and sex present:

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文