我有下表:
顾客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 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 ...