【问题标题】:Combining/concatenating the results of a CASE statement组合/连接 CASE 语句的结果
【发布时间】:2019-04-16 15:55:51
【问题描述】:

我正在使用 Oracle SQL 将客户列表及其交货天数提取到 Excel 中。数据的格式是这样的,每个交货日都有自己的记录,所以如果客户 10001 在星期一、星期三和星期五收到交货,我将返回三个记录(在这种情况下:2、4、6,因为我们的周周日开始)。

我已经用 CASE 将这些转换为首字母(M、W、F),但显然还是有 3 条记录。

我最初认为这是一个连接问题(我对 SQL 代码非常陌生)所以我尝试了标准双管道(||),但这不是同一种连接操作(我已经学习了双管道用于连接不同的字段)。

这是我的代码当前所在的位置:

SELECT 
TRIPS.CUSTOMER_NO||TRIPS.CUSTOMER_NAME as CUSTOMER, 
CASE
WHEN TRIPS.DAY_NO= 1 THEN 'U'
WHEN TRIPS.DAY_NO= 2 THEN 'M'
WHEN TRIPS.DAY_NO= 3 THEN 'T'
WHEN TRIPS.DAY_NO= 4 THEN 'W'
WHEN TRIPS.DAY_NO= 5 THEN 'R'
WHEN TRIPS.DAY_NO= 6 THEN 'F'
WHEN TRIPS.DAY_NO= 7 THEN 'S'
ELSE '0'
END AS DAYS
FROM DB.TRIPs

最后我希望每个客户返回一条记录,并连接交货天数(在本例中为 MWF)。有成千上万的客户,我目前不得不以一种非常笨拙的方式使用数据透视表来完成这项工作。

【问题讨论】:

    标签: sql oracle case


    【解决方案1】:

    我想你想要LISTAGG():

    SELECT t.CUSTOMER_NO || t.CUSTOMER_NAME as CUSTOMER, 
           LISTAGG(CASE WHEN t.DAY_NO = 1 THEN 'U'
                        WHEN t.DAY_NO = 2 THEN 'M'
                        WHEN t.DAY_NO = 3 THEN 'T'
                        WHEN t.DAY_NO = 4 THEN 'W'
                        WHEN t.DAY_NO = 5 THEN 'R'
                        WHEN t.DAY_NO = 6 THEN 'F'
                        WHEN t.DAY_NO = 7 THEN 'S'
                        ELSE '0'
                   END) WITHIN GROUP (ORDER BY t.DAY_NO) as days
    FROM DB.TRIPs t
    GROUP BY t.CUSTOMER_NO || t.CUSTOMER_NAME
    

    【讨论】:

    • 嗯。这会产生 ORA 00905 缺少关键字错误。
    猜你喜欢
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多