首页 > 解决方案 > 带有和不带子查询的数据透视表

问题描述

我是 SQL Server 新手,在 Hacker Rank 的帮助下学习东西

问题 - https://www.hackerrank.com/challenges/occupations/problem

查询(有了这个我们得到所有的行) -

SELECT
    [Doctor], [Professor], [Singer], [Actor]
FROM
(
    SELECT ROW_NUMBER() OVER (PARTITION BY OCCUPATION ORDER BY NAME) [RowNumber], * FROM OCCUPATIONS
) AS tempTable
PIVOT
(
    MAX(NAME) FOR OCCUPATION IN ([Doctor], [Professor], [Singer], [Actor])
) AS pivotTable

没有子查询(我们只得到一行,因为 min 或 max 从每个职业中取一行)-

SELECT [Doctor], [Professor], [Singer], [Actor]
FROM occupations as t
PIVOT
(
    max(name)
    FOR occupation IN ([Doctor], [Professor], [Singer], [Actor]) 
) AS P

那么,两个查询有什么区别呢?有什么SELECT ROW_NUMBER() OVER (PARTITION BY OCCUPATION ORDER BY NAME) [RowNumber], * FROM OCCUPATIONS不同?

标签: sqlsql-servertsql

解决方案


您只有名称和职业列 - 如果您按职业进行透视并聚合名称,则只会返回一行。通过添加 row_number,聚合不会将输出减少到单行,因为每一行都有不同的 row_number。


推荐阅读