如何根据每天的每日设备使用情况对ID进行细分

时间:2019-01-24 17:26:21

标签: sql sql-server

目标:我想根据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 |  
+------------+-----+--------+

3 个答案:

答案 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)

您需要group by dates, idcount的{​​{1}}的不同值:

device

请参见demo

答案 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等。