以表格格式显示结果集 - 在SQL中

时间:2016-03-31 11:35:13

标签: sql sql-server pivot

我有下表:

user_id    document_id    date
------------------------------------
1           1             2016-01-01
1           2             2016-01-01
1           3             2016-01-02
2           4             2016-01-01
2           5             2016-01-02
3           6             2016-01-02
3           7             2016-01-02
3           8             2016-01-02
3           9             2016-01-03
3          10             2016-01-03
3          11             2016-01-04
3           9             2016-01-04

是否可以 - 在SQL中 - 以表格格式获取每个用户每天查看的文档数量?

date          user_id_1    user_id_2    user_3
----------------------------------------------
2016-01-01    2            1            0
2016-01-02    1            1            3
2016-01-03    0            0            2
2016-01-04    0            0            2

通常我会使用任何脚本语言通过循环遍历结果集来创建它,但在这种特殊情况下我不能。由于限制,我只能访问SQL服务器。

如果可以做到这一点,我们非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

由于我不知道你的桌子是如何调用的,所以我称之为[YourTableNameGoesHere]

DECLARE @userstring AS nvarchar(max),
        @columns AS nvarchar(max),
        @sql AS nvarchar(max)

SELECT @userstring = stuff((select distinct ',' + quotename([user_id]) from [YourTableNameGoesHere] for xml path(''), type).value('.', 'nvarchar(max)'), 1, 1, '');
SELECT @columns = '[date],' + stuff((select distinct ',' + quotename([user_id]) + ' as ' + quotename('user_id_'+CAST([user_id] as nvarchar(10))) from [YourTableNameGoesHere] for xml path(''), type).value('.', 'nvarchar(max)'), 1, 1, '');

SELECT @sql = '
select '+@columns+'
from (select [date],
            [user_id],
            document_id
        from [YourTableNameGoesHere]) src 
pivot (COUNT(document_id) for [user_id] in ('+@userstring+')
) pvt'

EXECUTE(@sql)

输出结果为:

date       user_id_1   user_id_2   user_id_3
---------- ----------- ----------- -----------
2016-01-01 2           1           0
2016-01-02 1           1           3
2016-01-03 0           0           2
2016-01-04 0           0           2

(4 row(s) affected)