如何在 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 中使用数据透视?的主要内容,如果未能解决你的问题,请参考以下文章

如何将excel表格中数据透视后的汇总一栏去掉呢?

如何刷新数据透视图

excel中数据透视表,如何将空白的地方隐藏掉

如何转置 Excel 数据透视表

如何在不使用数据透视和反透视的情况下在 SQL Server 中水平显示数据?

当您有可变数量的透视行时,如何使用 Informatica 透视数据?