首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不带聚合的TSQL动态透视函数

不带聚合的TSQL动态透视函数
EN

Stack Overflow用户
提问于 2020-03-02 23:26:21
回答 1查看 35关注 0票数 0

我花了很多时间在谷歌上寻找我的问题的解决方案。我有一个这样的列表

它是来自如下查询的结果:

代码语言:javascript
运行
复制
SELECT        VBELN, POSNR, PATENT_ID
FROM            table
GROUP BY POSNR, VBELN, PATENT_ID
代码语言:javascript
运行
复制
  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的组合,我需要将此摘录转换为如下所示的列表

代码语言:javascript
运行
复制
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函数,这个想法对我来说很好。不幸的是,我没有得到我想要的结果。

我的结果如下:

代码语言:javascript
运行
复制
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是

代码语言:javascript
运行
复制
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条件仅用于测试目的...

也许你们中的某个人有办法帮我解决这个问题。

非常提前感谢您。

EN

回答 1

Stack Overflow用户

发布于 2020-03-02 23:30:12

我将对row_number()使用条件聚合

代码语言:javascript
运行
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60491948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档