2016-03-31 20 views
1

で私は以下の表を持っている:表示結果セット - SQL

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サーバーにしかアクセスできません。

これが可能であれば、どんな助けでも大歓迎です。

+9

グーグル: "SQL Serverのピボット"。 –

+0

[さらに1歩](https://www.google.co.il/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=sql%20server%20pivot)、[さらに2ステップ]( https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx) –

+2

ユーザーの数は制限されていますか?または無限のユーザーが存在する可能性がありますか? – sagi

答えて

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 '[email protected]+' 
from (select [date], 
      [user_id], 
      document_id 
     from [YourTableNameGoesHere]) src 
pivot (COUNT(document_id) for [user_id] in ('[email protected]+') 
) 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) 
関連する問題