SQL将多行合并为一行

时间:2014-09-08 13:59:14

标签: sql postgresql pivot

这似乎是一件容易的事,但我似乎无法绕过它。

我只需要每天都找出使用过移动设备的用户,使用过桌面的用户以及同时使用这两者的用户。每个user / access_dt组合应该只产生一行。

示例数据如下:

USER, ACCESS_DATE, FORMFACTOR
   1   01-01-2014      Mobile
   1   01-01-2014      Desktop
   2   01-01-2014      Mobile
   3   01-01-2014      Desktop

期望的输出:

USER, ACCESS_DATE, KEY_MOBILE, KEY_DESKTOP, KEY_MOBILE_DESKTOP
   1   01-01-2014           1            1                   1
   2   01-01-2014           1            0                   0
   3   01-01-2014           0            1                   0

非常感谢!

1 个答案:

答案 0 :(得分:4)

这是一个透视查询,基本上。我会用条件聚合来做到这一点:

select user, access_date,
       max(case when FORMFACTOR = 'Mobile' then 1 else 0 end) as KEY_MOBILE,
       max(case when FORMFACTOR = 'Desktop' then 1 else 0 end) as KEY_DESKTOP,
       (case when max(case when FORMFACTOR = 'Mobile' then 1 else 0 end)  > 0 and
                  max(case when FORMFACTOR = 'Desktop' then 1 else 0 end) > 0
             then 1 else 0
        end) as KEY_MOBILE_DESKTOP
from table t
group by user, access_date;