2016-03-31 12 views
0

Ich habe die folgende Tabelle:lesen Dokumente pro Benutzer pro Tag

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 

Ich möchte einen Überblick haben: (a) für jeden Tag in der Tabelle (b) wie viele Dokumente pro Benutzer gelesen wie folgt:

date   user_id document_count 
--------------------------------------- 
2016-01-01 1   2 
2016-01-01 2   1 
2016-01-01 3   0 
2016-01-02 1   1 
2016-01-02 2   1 
2016-01-02 3   3 
2016-01-03 1   0 
2016-01-03 2   0 
2016-01-03 3   2 
2016-01-04 1   0 
2016-01-04 2   0 
2016-01-04 3   2 

ich nur wissen, wie ein Ergebnis zu erhalten, wie (1) Dokumente pro Tag oder (2) Benutzer pro Tag nach dem Datum Gruppierung und eine Zählung auf der anderen Seite zu tun. Aber hier muss ich nach Benutzer UND Datum gruppieren, und ich weiß nicht, wie ich das machen soll.

Zu Lernzwecken, wie könnte ich auch die folgenden, verwandten Ergebnisse erzielen? Es würde wahrscheinlich eine andere Gruppierungsreihenfolge erfordern, aber ich bin unsicher.

user_id date   document_count 
-------------------------------------- 
1   2016-01-01 1 
1   2016-01-02 1 
1   2016-01-03 0 
1   2016-01-04 0 
2   2016-01-01 1 
2   2016-01-02 1 
2   2016-01-03 0 
2   2016-01-04 0 
3   2016-01-01 0 
3   2016-01-02 3 
3   2016-01-03 2 
3   2016-01-04 2 

Jede Hilfe wird sehr geschätzt.

+2

. . Ihr zweites Ergebnis sieht wie das erste Ergebnis aus, nur anders geordnet - 'order by user_id, date' statt' order by date, user_id'. –

Antwort

2

Dies ist schwierig, wegen der "0" zählt. Das heißt, Sie möchten eine Ausgabezeile, in der Sie keine Eingaben haben.

Ihre Frage besagt explizit, dass Sie nur auf die Daten in den Daten achten. Das ist praktisch - Daten müssen nicht generiert werden.

Der erste Schritt besteht darin, alle Ausgabezeilen unter Verwendung von CROSS JOIN zu generieren. Die zweite ist LEFT JOIN und GROUP BY zu verwenden, um die gewünschten Informationen zu erhalten:

select d.date, t.user_id, count(*) 
from (select distinct date from t) d cross join 
    (select distinct user_id from t) u left join 
    t 
    on t.date = d.date and t.user_id = u.user_id 
group by d.date, t.user_id 
order by d.date, t.user_id; 
1

Bitte überprüfen Sie folgende SELECT-Skript

/* 
create table UserDocuments (user_id int, document_id int, [date] date) 
insert into UserDocuments values 
(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') 
*/ 

select 
    [date], [user_id], count(*) document_count 
from UserDocuments 
group by [date], [user_id] 
order by [date], [user_id] 

Hallo, Ich aktualisiert die oben SELECT unter Zusatz eines TERMINE Tabelle Bitte überprüfen Sie unten das SQL-Skript

Sie können SQL-Tutorial wie zuüberprüfenmit rekursivem CTE-Ausdruck, wenn Sie Details zur Erstellung von Datumstabellen für Ihren Fall erhalten möchten

+0

Das funktioniert nicht, weil Sie mit diesem Skript keine Einträge für Benutzer erhalten, die an einem Tag kein Dokument gelesen haben. – schlonzo

+0

Ich habe das Skript aktualisiert, indem ich eine SQL-Tabelle Dates in der FROM-Klausel der SELECT-Anweisung hinzugefügt habe, danke schlonzo, um mich an die Datumsüberlegung zu erinnern – Eralper

Verwandte Themen