【问题标题】:Using Pivot in MS SQL Server?在 MS SQL Server 中使用 Pivot?
【发布时间】:2021-03-19 05:11:19
【问题描述】:

这里是问题的链接。

Hackerrank occupations problem link

我是 sql 和这个社区的新手。所以提前;如果这是太基本的东西或者我的查询太混乱,我很抱歉。

无论如何,我认为解决方案是对数据进行透视。我写了一个查询,但没有用。这是我的工作;

Select [Doctor],[Profesor], [Singer],[Actor] 
from
(select row_number() over (partition by occupation order by name) [RowNumber], * from occupations ) as ttable
PIVOT
(
max(name) for occupation in ([Doctor],[Profesor],[Singer],[Actor])
)
as pivottable;

我不知道这个查询的问题出在哪里。各位大神能指教一下吗?

【问题讨论】:

  • 嗨,欢迎来到 Stack Overflow。我们很高兴你在这里。如果您告诉我们您打算查询做什么,这将有助于人们回答您的问题。否则我们无法知道它是否能解决您的需求。不,我不会点击你的链接。在这篇文章中解释它。显示示例数据,以及在给定示例数据的情况下您希望查询结果的示例。

标签: sql sql-server pivot aggregate-functions window-functions


【解决方案1】:

我喜欢为此使用条件聚合:它比pivot 更灵活,通常可以跨数据库移植(与特定于供应商的pivots 不同),并且至少与定制语法一样好:

select 
    max(case when occupation = 'Doctor'    then name end) as doctor,
    max(case when occupation = 'Professor' then name end) as professor,
    max(case when occupation = 'Singer'    then name end) as singer,
    max(case when occupation = 'Actor'     then name end) as actor
from (
    select o.*,
        row_number() over(partition by occupation order by name) rn
    from occupations o
) o
group by rn

【讨论】:

    【解决方案2】:

    Max(Case... 聚合选项效果很好,我经常使用它,但您的枢轴点非常接近:

    Select [Doctor],[Professor], [Singer],[Actor] 
    from(
        select row_number() over (order by name) [RowNumber], * from Occupations 
    ) as ttable
    PIVOT(
      max(name) for occupation in ([Doctor],[Professor],[Singer],[Actor])
    )
    as pivottable;
    

    只需摆脱窗口函数中用于计算行数的分区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多