暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在Oracle中将多行合并为单个行?

ASKTOM 2020-12-07
422

问题描述

你好,

我的测试表中有3列,比如

NAME    |      DATE      | TOTAL_SALES
---------- ----------------------------
TOM     |  01/12/2020    |    8                  
TOM     |  02/12/2020    |    9                  
TOM     |  03/12/2020    |    4                  
GEORGE  |  01/12/2020    |    6                  
GEORGE  |  02/12/2020    |    5 


有什么方法可以将基于列1的列2和3合并为一个单独的行。结果应该是


NAME    |  01/12/2020   |  02/12/2020  |  03/12/2020  |  
-------- --------------- -------------- -------------- 
TOM     |       8       |      9       |       4      |
GEORGE  |       6       |      5       |       0      |

专家解答

你可以枢转!

with rws as (
  select mod ( level, 2 ) val, 
         date'2020-12-01' + mod ( level, 3 ) dt
  from   dual
  connect by level <= 5
), formatted as (
  select val, to_char ( dt, 'yyyy-mm-dd' ) dt
  from   rws
)
  select * from formatted
  pivot (
    count (*) for dt in (
      '2020-12-01' as d1, 
      '2020-12-02' as d2, 
      '2020-12-03' as d3
    )
  );
  
VAL    D1    D2    D3   
  1     1     1     1 
  0     0     1     1 


将日期值转换为列标题是棘手的,因为:

* 您需要先将它们转换为字符值,然后再在in子句中使用它们
* 它们可能每次都会更改,这意味着您需要一个动态的枢轴。对此没有简单的解决方案。

有关更多信息,请阅读:

https://blogs.oracle.com/sql/how-to-convert-rows-to-columns-and-back-again-with-sql-aka-pivot-and-unpivot
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论