SQL -Abfrage zum Zusammenführen von zwei aggregierten Teilmengen aus derselben Tabelle
-
14-10-2019 - |
Frage
Ich habe eine Daten geschrieben. Welche Stunde des Tages stellt ein Benutzer Fragen und Antworten veröffentlicht. Sie können die SQL dort sehen. Die Ergebnisse sehen derzeit so aus:
hour hour questions answers
---- ---- --------- -------
0 0 1 4
null 2 null 4
null 3 null 5
null 4 null 7
null 5 null 11
null 6 null 10
null 7 null 6
null 8 null 1
null 13 null 1
null 14 null 7
null 15 null 8
null 16 null 11
null 17 null 4
null 18 null 10
null 19 null 4
null 20 null 6
null 21 null 7
22 22 1 6
null 23 null 2
Wie kann ich die Abfrage an:
- Zusammenführen beide Stundenspalten in eine einzelne Spalte und
- Wenn Fragen/Antworten sind
null
, einstellen0
stattdessen.
Teil 2 hat eine niedrige Priorität.
Bearbeiten: Hier ist die vollständige SQL der ursprünglichen Abfrage, da ich sie basierend auf der Antwort verbessern kann:
SELECT
q.hour, a.hour, questions, answers
FROM
(
SELECT
datepart(hour,creationdate) AS hour,
count(*) AS questions
FROM posts
WHERE posttypeid=1 AND OwnerUserId=##UserID##
GROUP BY datepart(hour,creationdate)
) q
FULL JOIN
(
SELECT
datepart(hour,creationdate) AS hour,
count(*) AS answers
FROM posts
WHERE posttypeid=2 AND OwnerUserId=##UserID##
GROUP BY datepart(hour,creationdate)
) a
ON q.hour = a.hour
ORDER BY a.hour, q.hour
Lösung
SELECT
ISNULL(q.hour, a.hour) AS hour,
ISNULL(questions,0) AS questions,
ISNULL(answers,0) AS answers
Oder schreiben Sie die Abfrage neu, um die loszuwerden full join
SELECT
datepart(hour,creationdate) AS hour,
count(CASE WHEN posttypeid = 1 THEN 1 END) AS questions,
count(CASE WHEN posttypeid = 2 THEN 1 END) AS answers
FROM posts
WHERE posttypeid IN (1,2) AND OwnerUserId=##UserID##
GROUP BY datepart(hour,creationdate)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow