如何在Oracle中“水平化”多行

cfh9epnr  于 2023-04-05  发布在  Oracle
关注(0)|答案(1)|浏览(107)

我有一个表格,内容如下:
| 日期|用户|身份证|计数|
| --------------|--------------|--------------|--------------|
| 2023年3月11日|a1|10个|小行星|
| 2023年3月11日|a1|二十|小行星510|
| 2023年3月11日|a1|四十|七八八|
| 2023年3月11日|a2|二十|三百|
| 2023年3月12日|a1|三十|四百|
我的结果表应该是这样的:
| 日期|用户|ID10|ID20|ID30|ID40|
| --------------|--------------|--------------|--------------|--------------|--------------|
| 2023年3月11日|a1|小行星|小行星510||七八八|
| 2023年3月11日|a2||三百|||
| 2023年3月12日|a1|||四百||
列是硬编码的,没有预期的变化。只是id的计数应该在一行而不是多行中显示。
我尝试使用分区,但它显示在不同的行中,如下所示:
| 日期|用户|ID10|ID20|ID30|ID40|
| --------------|--------------|--------------|--------------|--------------|--------------|
| 2023年3月11日|a1|小行星||||
| 2023年3月11日|a1||小行星510|||
。。。等等。。
再次感谢你的帮助。
迈克

hyrbngr7

hyrbngr71#

使用聚合(如MAX或SUM)折叠行,并使用DECODE或CASE选择性地决定在每列中包含什么,如下所示:

SELECT date,
       usr,
       SUM(DECODE(id,10,count,0)) id10,
       SUM(DECODE(id,20,count,0)) id20,
       SUM(DECODE(id,30,count,0)) id30,
       SUM(DECODE(id,40,count,0)) id40
  FROM table
 GROUP BY date,
          usr

SELECT date,
       usr,
       MAX(DECODE(id,10,count)) id10,
       MAX(DECODE(id,20,count)) id20,
       MAX(DECODE(id,30,count)) id30,
       MAX(DECODE(id,40,count)) id40
  FROM table
 GROUP BY date,
          usr

除了不使用COUNT或DATE作为列名外,它们是保留关键字。

相关问题