我花了很多时间在谷歌上寻找我的问题的解决方案。我有一个这样的列表
它是来自如下查询的结果:
SELECT VBELN, POSNR, PATENT_ID
FROM table
GROUP BY POSNR, VBELN, PATENT_ID
VBELN POSNR PATENT_ID
0090139195 000100 PIST-1
0090139195 000100 PIST-2
0090139195 000100 PIST-3
0090139195 000100 PIST-4
0090139195 000100 PIST-5
0090139195 000100 PIST-6
0090139195 000100 PIST-7
一个计费位置有1个物料,该物料可以有0到20个左右的patent_ids。
为了比较Patent_IDs的组合,我需要将此摘录转换为如下所示的列表
VBELN POSNR Patent 1 Patent 2 Patent 3 Patent 4 Patent 5 Patent 6 Patent 7
90139195 100 Pist-1 Pist-2 Pist-3 Pist-4 Pist-5 Pist-6 Pist-7
在我们的实际解决方案中,我们有一个非常错误的50 (!)视图。(不是我自己创建的)这个视图是一个大型存储过程的一部分,结果是错误的。我不想在所有这些视图中查看并修复它。
因此,我在TSQL中评估了pivot函数,这个想法对我来说很好。不幸的是,我没有得到我想要的结果。
我的结果如下:
VBELN POSNR Patent 1 Patent 2 Patent 3 Patent 4 Patent 5 Patent 6 Patent 7
0090139195 000100 NULL NULL NULL NULL NULL NULL NULL
TSQL是
select vbeln, posnr, patent1, patent2, patent3, patent4, patent5, patent6, patent7
from
(
select VBELN, POSNR, PATENT_ID, Key_pos
from tablename
where VBELN = N'0090139195'
) d
pivot
(
min(Key_pos)
for patent_id in (patent1, patent2, patent3, patent4, patent5, patent6, patent7 )
) piv;
Where条件仅用于测试目的...
也许你们中的某个人有办法帮我解决这个问题。
非常提前感谢您。
发布于 2020-03-02 23:30:12
我将对row_number()
使用条件聚合
SELECT VBELN, POSNR,
MAX(CASE WHEN seqnum = 1 THEN PATENT_ID END) as PATENT_ID_1,
MAX(CASE WHEN seqnum = 2 THEN PATENT_ID END) as PATENT_ID_2,
MAX(CASE WHEN seqnum = 3 THEN PATENT_ID END) as PATENT_ID_3,
MAX(CASE WHEN seqnum = 4 THEN PATENT_ID END) as PATENT_ID_4,
MAX(CASE WHEN seqnum = 5 THEN PATENT_ID END) as PATENT_ID_5,
MAX(CASE WHEN seqnum = 6 THEN PATENT_ID END) as PATENT_ID_6,
MAX(CASE WHEN seqnum = 7 THEN PATENT_ID END) as PATENT_ID_7
FROM (SELECT t.*,
ROW_NUMBER() OVER (PARTITION BY VBELN, POSNER ORDER BY PATENT_ID) as seqnum
FROM table
) t
GROUP BY POSNR, VBELN;
https://stackoverflow.com/questions/60491948
复制相似问题