2016-03-31 3 views
1

Ich habe die folgende Tabelle:Anzeige des Suchresultates in tabellarischer Form - in 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 

Ist es möglich - in SQL - betrachten die Anzahl der Dokumente erhalten, pro Benutzer pro Tag, in tabellarischer Form?

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 

Normalerweise würde ich jede Skriptsprache verwenden, um dies zu schaffen, indem sie durch einen resultset Looping, aber in diesem speziellen Fall kann ich nicht. Aufgrund von Einschränkungen habe ich nur Zugriff auf SQL Server.

Wenn dies auch möglich ist, wird jede Hilfe sehr geschätzt.

+9

Google: "SQL Server Pivot". –

+0

[ein Schritt weiter] (https://www.google.co.il/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=sql%20server%20pivot), [zwei Schritte weiter] (https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx) –

+2

Sind Benutzer in der Menge begrenzt? oder kann es Unendliche Benutzer geben? – sagi

Antwort

1

Wie ich weiß nicht, wie Sie Ihre Tabelle genannt wird, so nenne ich es [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) 

Die Ausgabe lautet:

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)