-2

我有其他人写的这个查询,我试图弄清楚它是如何工作的。我对所有这些事情都有大致的了解,例如row_number(), partition bypivot但我无法一起理解它们。

对于这个查询:

select
    d, p, s, a  
from
(
    select name,occupation, (ROW_NUMBER() OVER (partition by occupation order by name)) as rownumber from occupations 
)
pivot
(
    max(name) 
    for occupation 
    in ('Doctor' as d, 'Professor' as p, 'Singer' as s, 'Actor' as a) 
) 
order by rownumber;

这是上述查询工作的输入表:

在此处输入图像描述

这是查询生成的输出,根据问题是正确的:

Jenny    Ashley     Meera  Jane
Samantha Christeen  Priya  Julia
NULL     Ketty      NULL   Maria

现在,我想知道查询是如何生成输出的,即逐步执行流程。与上述情况相匹配的简单示例的解释将不胜感激。提前致谢。

4

1 回答 1

0

Afterfrom子句您有以下内容:

select name,occupation, (ROW_NUMBER() OVER (partition by occupation order by name))

上面实际上将您的表数据重新堆叠在三列中 - 名称、职业、行号。rownumber 将在职业列更改后立即重置。输出数据如下:

NAME                 OCCUPATION            ROWNUMBER
-------------------- -------------------- ----------
Jane                 ACTOR                1
Julia                ACTOR                2
Maria                ACTOR                3
JENNY                DOCTOR               1 <-- rownumber reset to 1
Sammantha            DOCTOR               2

枢轴功能可让您聚合结果并将行旋转到列中。枢轴使用代码是:

PIVOT 
(
  aggregate_function(column2)
  FOR column2
  IN ( expr1, expr2, ... expr_n) | subquery
)

因此,您的PIVOT函数具有NAME基于OCCUPATION. 每个堆栈(输出中的列)rownumber column通过第一个子查询插入排序。

于 2017-07-06T16:02:48.483 回答