合并/合并CASE语句的结果

时间:2019-04-16 15:55:52

标签: sql oracle case

我正在使用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)。有成千上万的客户,我目前不得不以非常笨拙的方式使用数据透视表来完成此任务。

1 个答案:

答案 0 :(得分: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