目标:我想根据ID每天的设备类型使用情况对其进行细分。如果ID仅使用pc,则为“ pc”。如果仅移动,则为“移动”。如果至少有1部手机和1部电脑,则均为“两者”。
样本数据:
CREATE TABLE #test1 (
dates DATE
,id INT
,device CHAR(30)
)
INSERT INTO #test1
VALUES
('2018-01-01', 123, 'pc')
,('2018-01-01', 123, 'pc')
,('2018-01-01', 123, 'mobile')
,('2018-01-01', 123, 'mobile')
,('2018-01-01', 800, 'mobile')
,('2018-01-01', 800, 'mobile')
,('2018-01-01', 800, 'mobile')
,('2018-01-01', 500, 'pc')
,('2018-01-01', 500, 'pc')
,('2018-01-02', 123, 'mobile')
这是我到目前为止尝试过的,但无济于事:
SELECT DISTINCT dates
, id
,CASE
WHEN device = 'pc' AND device = 'mobile' THEN 'Both'
WHEN device = 'pc' THEN 'pc'
ELSE 'mobile'
END AS x
FROM #test1
我的输出应如下所示:
+------------+-----+--------+
| dates | id | x |
+------------+-----+--------+
| 2018-01-01 | 123 | both |
| 2018-01-01 | 800 | mobile |
| 2018-01-01 | 500 | pc |
| 2018-01-02 | 123 | mobile |
+------------+-----+--------+
答案 0 :(得分:3)
CASE
表达式每行最后出现一次,因此它无法按照您的编写方式工作,因此可以使用use exists
:
select distinct t.dates, t.id,
(case when exists (select 1 from #test1 t1 where t1.dates = t.dates and t1.id = t.id and t1.device <> t.device)
then 'both'
else t.device
end) as x
from #test1 t;
答案 1 :(得分:3)
答案 2 :(得分:2)
这应该可以帮助您或给您一个想法:
;WITH cte AS (SELECT DISTINCT dates, id
, CASE device WHEN 'pc' THEN 1 WHEN 'mobile' THEN 2 END AS x
FROM #test1)
SELECT dates, id,
CASE SUM(x) WHEN 1 THEN 'pc' WHEN 2 THEN 'mobile' WHEN 3 THEN 'both' END
FROM cte GROUP BY dates, id
潜在地,您甚至可以拥有更多项,只需将它们以2的幂编码为1,2,4,8,16等。