SUM 和串联

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

我有下表:

顾客1 苹果 梨子 葡萄 橙色
1 1 0 0 1
2 0 1 1 1
3 0 0 0 1
4 0 0 0 1

如果客户只有橙子,我想要一列设置为 1,另一列由用“,”分隔的水果串联而成,例如:

顾客1 苹果 梨子 葡萄 橙色 仅_橙色 水果
1 1 0 0 1 0 苹果、橙子
2 0 1 1 1 0 梨、葡萄、橙子
3 0 0 0 1 1 橙色
4 0 0 0 1 1 橙色

我所做的是进行查询,在其中我会得到只有橙子的客户,然后将其放入临时表中

     Select [costumer1] 
     into #tmp1
     from costumer_fruits
     where [apple]=0 and [pear]=0 and [grape]=0 and [orange]=1

后来我对原来的表进行了左连接,并将空值更改为“0”,得到了下表,虽然我达到了结果,但我不知道是否还有其他方法,但我无法完成连接部分不再了。

sql sql-server concatenation
1个回答
0
投票

如果您使用相当新的 sql server 版本,

CONCAT_WS
简化了此任务:

select  *
,   orange  * (1 - SIGN(apple + pear + grape))
,   CONCAT_WS(',',CASE WHEN apple = 1 THEN 'apple' END, CASE WHEN pear = 1 THEN 'pear' END, CASE WHEN grape = 1 THEN 'grape' END, CASE WHEN orange = 1 THEN 'orange' END)
from (
    VALUES  (1, 1, 0, 0, 1)
    ,   (2, 0, 1, 1, 1)
    ,   (3, 0, 0, 0, 1)
    ,   (4, 0, 0, 0, 1)
) t (costumer1,apple,pear,grape,orange)

对于旧版本,使用 CONCAT,但它有点难看:

select  *
,   orange  * (1 - SIGN(apple + pear + grape))
,   STUFF(CONCAT(',' + CASE WHEN apple = 1 THEN 'apple' END, ',' + CASE WHEN pear = 1 THEN 'pear' END, ',' + CASE WHEN grape = 1 THEN 'grape' END, ',' + CASE WHEN orange = 1 THEN 'orange' END), 1, 1, '')
from ...
© www.soinside.com 2019 - 2024. All rights reserved.