如何在 SQL/DB2 中使用数据透视?
Posted
技术标签:
【中文标题】如何在 SQL/DB2 中使用数据透视?【英文标题】:How to use pivot in SQL/DB2? 【发布时间】:2021-10-20 12:45:53 【问题描述】:如果我有 2 个表,如何在 DB2(或 SQL)中使用数据透视?
表1
Userid | Username |
---|---|
001 | Mike |
002 | Tomm |
003 | Suse |
表2
Userid | Date_visit | item |
---|---|---|
001 | 2021-10-01 | bread |
001 | 2021-10-01 | chocolate |
001 | 2021-10-03 | pasta |
002 | 2021-10-06 | pizza |
002 | 2021-10-08 | camera |
002 | 2021-10-08 | usb-stick |
002 | 2021-10-22 | gloves |
002 | 2021-11-04 | split logs |
我需要这样的输出
输出
Userid | Username | month | item1 | item2 | item3 | item 4 |
---|---|---|---|---|---|---|
001 | Mike | October 21 | bread | chocolate | pasta | |
002 | Tomm | October 21 | pizza | camera | usb-stick | gloves |
002 | Tomm | November 21 | split logs |
谢谢!
【问题讨论】:
在 SQL 查询中,您需要提前知道结果列的数量。你的情况是这样的吗(第 1-4 项)?如果不是,则需要运行初始查询来确定这一点,然后您可以根据初始查询组装动态 SQL。 感谢您回答穿刺者。不,结果列的数量是未知的。您知道我如何将如此命名的初始查询与动态 SQL 结合起来吗? 这能回答你的问题吗? Pivoting in DB2 您好查尔斯,感谢您的回答。建议的主题没有回答我的问题,项目名称是已知的,在我的表中它可以是所有内容。我只需要在每个月分组的一行中列出所有购买项目。谢谢。 【参考方案1】:您可以按照here 的描述创建一个通用存储过程。 对应的调用:
call pivot
(
'SELECT B.USERID, A.USERNAME, TO_CHAR (B.DATE_VISIT, ''Month YY'') AS MONTH, B.ITEM, ''ITEM'' || ROW_NUMBER () OVER (PARTITION BY B.USERID, A.USERNAME, TO_CHAR (B.DATE_VISIT, ''Month YY'') ORDER BY B.ITEM) AS ITEM_NM FROM TABLE1 A JOIN TABLE2 B ON B.USERID = A.USERID'
, 'USERID, USERNAME, MONTH'
, 'ITEM_NM'
, 'ITEM'
, 'max'
, 'session.tab1'
, '-'
, ?, ?, ?
);
【讨论】:
以上是关于如何在 SQL/DB2 中使用数据透视?的主要内容,如果未能解决你的问题,请参考以下文章