2016-12-22 4 views
2

gilt Ich habe zwei Tabellenzählen auch wenn die Bedingung nicht

1) Dokument: die ein Dokument

+----+----------+------+ 
| ID | Body  | Type | 
+----+----------+------+ 
| 1 | Ramesh | 1 | 
| 2 | Khilan | 1 | 
| 3 | kaushik | 4 | 
| 4 | Chaitali | 2 | 
| 5 | Hardik | 2 | 
+----+----------+------+ 

2) Destination darstellen: die eine Partei des Dokuments darstellen

+--------+------------+--------+ 
| UserId | DocumentId | Status | 
+--------+------------+--------+ 
| 6 |  3  | 4 | 
| 4 |  5  | 5 | 
| 89 |  2  | 0 | 
| 15 |  4  | 3 | 
| 89 |  1  | 0 | 
+--------+------------+--------+ 

Die Statusspalte stellt einen Ordner für den Benutzer dar, ich möchte die Anzahl für jeden Typ für jeden Ordner abrufen, auch wenn der Ordner für einen bestimmten Benutzer leer ist, jedoch wenn sie in dies aus,

+--------+--------+--------------+--------------+--------------+ 
| UserId | Status | Type 1 Count | Type 2 Count | Type 4 Count | 
+--------+--------+--------------+--------------+--------------+ 
| 89 | 0 |  2  |  0  |  0  | 
| 89 | 3 |  0  |  0  |  0  | 
| 89 | 4 |  0  |  0  |  0  | 
| 89 | 5 |  0  |  0  |  0  | 
+--------+--------+--------------+--------------+--------------+ 

das Problem, das ich mit Blick auf bin ich ist kein Weg, um die Arten zu erhalten finden kann der Benutzer nicht durch beitreten hat, gebe ich sie CASE mit bekommen können, aber nicht in der Form ich will

meine Frage ist:

`SELECT dd.[Status], 
    SUM(CASE WHEN d.[Type] = 1 THEN 1 ELSE 0 END) AS 'Type1Count' 
    SUM(CASE WHEN d.[Type] = 2 THEN 1 ELSE 0 END) AS 'Type2Count' 
    SUM(CASE WHEN d.[Type] = 4 THEN 1 ELSE 0 END) AS 'Type4Count' 
FROM [User] u LEFT JOIN [Destination] dd ON u.[Id] = dd.[UserId] 
    LEFT JOIN [Document] d ON dd.[DocumentId] = d.[Id] 
WHERE u.[Id] = @UserId` 

das Ergebnis

+--------+--------+--------------+--------------+--------------+ 
| UserId | Status | Type 1 Count | Type 2 Count | Type 4 Count | 
+--------+--------+--------------+--------------+--------------+ 
| 89 | 0 |  2  |  0  |  0  | 
+--------+--------+--------------+--------------+--------------+ 
+0

Was Ihre Fragen aus? Wie sehen deine Ergebnisse aus? – negacao

+0

Off-Topic: Warum ändern Sie die Tabellenformatierung immer wieder und geben Ihrer Frage ein besseres, lesbareres Aussehen? –

+0

Entschuldigung, wenn ich tat, ich bin immer noch nicht mit dem Website-Editor –

Antwort

1

so dass alle Benutzer auf eine Tabelle aller Zustände verbinden ist (I Diesen Ordner als pro Sie Beschreibung in der Frage genannt haben), bevor Sie dann zu Document verbinden und Destination:

SELECT u.UserId, st.Status, 
SUM(CASE WHEN doc.Type = 1 THEN 1 ELSE 0 END) AS [Type 1 Count], 
SUM(CASE WHEN doc.Type = 2 THEN 1 ELSE 0 END) AS [Type 2 Count], 
SUM(CASE WHEN doc.Type = 4 THEN 1 ELSE 0 END) AS [Type 4 Count] 

FROM User u 

CROSS JOIN Folder st 

LEFT OUTER JOIN Destination d 
ON d.UserId = u.UserId 
AND d.Status = st.Status 

LEFT OUTER JOIN Document doc 
ON doc.ID = d.DocumentId 

GROUP BY u.UserId, st.Status 

ORDER BY u.UserId 
+0

es gab mir das gleiche Ergebnis wie meine Abfrage, die nicht geholfen –

+0

Ich sehe das Problem - es war nicht sofort in der ersten Überarbeitung der Frage offensichtlich. Ich habe meine Antwort entsprechend geändert. – strickt01

+0

@ strickt01 Dein 'inner join (Select ...) on 1 = 1' ist wirklich nur ein' cross join' ... warum nennst du es nicht so? Du würdest die 1 = 1 eliminieren. Das "Problem ist, dass nicht alle Benutzer alle Statuten haben, also wenn Sie einen Cross-Join für Benutzer für alle möglichen Status erstellen, haben Sie einen Datensatz für jeden Benutzerstatus und können dann für das Dokument/Ziel zählen. Das ist, was Sie über gemacht haben ein Kreuz verbinden – xQbert

Verwandte Themen