Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL将多行转换为一行_Sql_Postgresql_Pivot - Fatal编程技术网

SQL将多行转换为一行

SQL将多行转换为一行,sql,postgresql,pivot,Sql,Postgresql,Pivot,这似乎是一项容易的任务,但我似乎不能全神贯注于此 我只需要找出,每天使用手机的用户,使用桌面的用户和同时使用这两种设备的用户。每个用户/访问\u 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 期望输出:

这似乎是一项容易的任务,但我似乎不能全神贯注于此

我只需要找出,每天使用手机的用户,使用桌面的用户和同时使用这两种设备的用户。每个用户/访问\u 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

多谢各位

这基本上是一个pivot查询。我会使用条件聚合来实现这一点:

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;

这基本上是一个pivot查询。我会使用条件聚合来实现这一点:

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;

哇,太快了。谢谢。很确定,这就是我需要的。哇,太快了。谢谢。很确定,这就是我需要的。