组合/连接CASE语句的结果

问题描述 投票:2回答:1

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

我已经使用CASE将这些转换为缩写(M,W,F),但显然还有三个记录。

我最初认为这是一个连接问题(我对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个回答
2
投票

我想你想要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
© www.soinside.com 2019 - 2024. All rights reserved.