我正在尝试根据活动日期生成列。
我之前使用过FULL JOIN
,但即使使用CASE
,它也只会生成重复的行。
关于如何处理这个问题的一些指导会很棒。
Table 1
是我当前的数据,Result
是我要找的表。
答案 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';