【问题标题】:Retrieving multiple rows using Pivot in SQL在 SQL 中使用 Pivot 检索多行
【发布时间】:2018-05-14 10:12:41
【问题描述】:

我很难理解下面的 SQL 查询来透视表,

表格名称:职业

Name    | Occupation
-----------------
Sam     | Actor
Julia   | Singer
Ketty   | Actor

预期结果:

Actor   | Singer
----------------
Sam     | Julia
Ketty   | null

我只有一行,当我执行下面的查询时,

Select [Actor],[Singer] From ( Select Occupation,Name From Occupations
 )sub Pivot (Max(Name) For Occupation in ([Actor],[Singer])) pvt

输出:

Actor   | Singer
----------------
Sam | Julia

当我使用 RowNumber() 修改上述查询时,我得到了预期的结果(多行)。

 Select [Actor],[Singer] 
 From ( Select Occupation,Name,Row_Number() over(partition by Occupation order by Name)SNo
 From Occupations )sub
 Pivot (Max(Name) For Occupation in ([Actor],[Singer])) pvt

你能解释一下,如何在子查询中添加 Row_Number 函数给出多行?

【问题讨论】:

  • 您的源数据不足以进行透视,因为没有将一位演员与另一位歌手逻辑连接的列。
  • 其实我只想要演员和歌手的名单。如果我在问题中执行第二个查询,我得到了结果,但我不知道它是如何工作的。
  • 为此,最好用谷歌搜索而不是问问题,看看PIVOTRow_Number() 是如何工作的?
  • @SuryaPrakash 下面的 Yogesh 答案应该适合你。

标签: sql sql-server pivot


【解决方案1】:

Pivot 是一个棘手的语法。它为 other 列的所有组合返回一行,而不是 pivot 所涉及的列。当你这样做时:

Select [Actor], [Singer] 
From (Select Occupation, Name,
      From Occupations
     ) sub
Pivot (Max(Name) For Occupation in ([Actor], [Singer])) pvt

还有 no 其他行。因此,返回一行。

添加时:

row_Number() over (partition by Occupation order by Name) as sno

您现在有另一个不同的列,它被pivot(隐式)使用。

这种尴尬的行为是我更喜欢条件聚合而不是 pivot 的原因之一。

【讨论】:

  • 谢谢 Gordon,这就是我一直在寻找的答案。
【解决方案2】:

你想要条件聚合:

select 
        max(case when Occupation = 'Actor' then Name end) [Actor],
        max(case when Occupation = 'Singer' then Name end) [Singer]
from (select *,
            row_number() over (partition by Occupation order by Name) Seq
      from table t
     ) t
group by Seq;

由于上述数据模型没有任何基于所需结果的分组column/field。因此,您可以使用解析函数生成序列,并像在GROUPING 中一样使用它们。

【讨论】:

  • 您好 Yogesh,您的查询运行良好。但我只想使用 pivot 来实现同样的目标。
  • @SuryaPrakash... 您的pivot 查询也应该有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多