T-SQL:按日期过滤列

时间:2017-09-17 15:44:45

标签: sql sql-server join

我正在尝试根据活动日期生成列。 我之前使用过FULL JOIN,但即使使用CASE,它也只会生成重复的行。

关于如何处理这个问题的一些指导会很棒。 Table 1是我当前的数据,Result是我要找的表。

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以在动态sql上使用PIVOT(),以允许[date]列中未知数量的日期在转置后用作列名。

由于你不能通过MAX(活动)直接PIVOT原始数据,每个用户ID只能给出一行,你可以有一个内部子查询,它将引入另一个列,来自ROW_NUMBER()的rnum。这将不允许在用户标识级别进行聚合并保持行数。

DECLARE @cols  AS NVARCHAR(MAX),
        @query AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME([date]) 
                     FROM table1 t -- use your table name
                      FOR XML PATH(''), TYPE
                  ).value('.', 'NVARCHAR(MAX)'),1,1,'')

SET @query = 'SELECT userid, ' + @cols + '
                FROM (SELECT userid, rnum, ' + @cols + '
                        FROM (SELECT *,
                                     ROW_NUMBER() OVER (PARTITION BY userid, 
                                                                     [date] 
                                                            ORDER BY [date]) rnum
                                FROM table1) x
                        PIVOT (MAX(activity)
                          FOR [date] IN (' + @cols +')) p
                      ) t
               ORDER BY userid'

EXECUTE(@query)
GO

结果

userid  2018-09-10  2018-09-11  2018-09-12
1       gym         run         gym
1       run         NULL        run
1       push-ups    NULL        NULL
2       gym         NULL        gym
3       run         NULL        run
4       gym         push-ups    gym
4       NULL        run         NULL

答案 1 :(得分:0)

SELECT userid, date, activity
FROM table1
WHERE date = '9/10/2018'
UNION ALL
SELECT userid, date, activity
FROM table1
WHERE date = '9/11/2018'
UNION ALL
SELECT userid, date, activity
FROM table1
WHERE date = '9/12/2018';