【发布时间】:2017-09-12 15:20:36
【问题描述】:
我有一个属性的占用者列表,并且需要处理数据,因此它将属性显示为一行,每个额外的占用者出现在一个新列中。
这是我到目前为止所做的:
with RANKING AS
( Select
Postcode
, Number
, Occupant
, RANK() OVER
(Partition by Postcode order by Occupant) as [Rank]
from Reporting.dbo.Test --order by [Rank] desc
)
RANKING中的查询输出下表:
Postcode | Number | Occupant | Rank
AA001AA | 12 | D | 1
AA001AA | 12 | E | 2
AA001AA | 12 | K | 3
AA001AA | 12 | M | 4
AA001AA | 12 | T | 5
BB001BB | 8 | M | 1
BB001BB | 8 | R | 2
等等
然后我尝试使用排名的值来创建列,如下所示:
Select distinct
i.Postcode
, i.Number
, case when i.[rank] = 1 then i.Occupant end as [First Tennant]
, case when i.[rank] = 2 then i.Occupant end as [Second Tennant]
, case when i.[rank] = 3 then i.Occupant end as [Third Tennant]
, case when i.[rank] = 4 then i.Occupant end as [Fourth Tennant]
, case when i.[rank] = 5 then i.Occupant end as [Fifth Tennant]
from Reporting.dbo.Test u
inner join RANKING i on i.Postcode = u.Postcode
现在,两个问题:
1) 有没有办法自动化这个过程,所以对于 x 的排名,我们有 x 个租户行
2) 这个输出的表格是
Postcode | Number | First Tennant | Second Tennant | Third Tennant | Fourth Tennant | Fifth Tennant |
AA001AA | 12 | D | NULL | NULL | NULL | NULL |
AA001AA | 12 | NULL | E | NULL | NULL | NULL |
等等
如何压缩此列表,以便每个邮政编码只有一行,并且所有非空值都出现在该行上。
【问题讨论】:
-
您需要实际的单词“First”、“second”等吗?或者那里有数字就足够了?它不会从根本上改变答案,但如果您需要这些,您可能需要一个额外的映射表来将数字映射到它们的字符串表示形式。
-
您可以使用动态枢轴自动执行此操作。列数将等于给定邮政编码/数字所需的最大值。所有不包含这些租户的行都将出现 NULL。
-
任何区分它的方法都可以,如果有一种方法,例如,Tennant(排名值),那很好。
-
您可以使用像这样的动态枢轴stackoverflow.com/questions/10404348/…
标签: sql-server rank