requête SQL pour fusionner deux sous-ensembles agrégés de la même table
-
14-10-2019 - |
Question
J'ai écrit une requête data.stackexchange pour trouver quelle heure de la journée un utilisateur questions et réponses . Vous pouvez voir le SQL là. Les résultats semblent en ce moment comme ceci:
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
Comment puis-je modifier la requête à:
- fusionner les deux colonnes d'une heure dans une seule colonne, et
- si les questions / réponses sont
null
, ensemble à la place0
.
Partie 2 est faible priorité.
Modifier : Voici la version complète de SQL de la requête initiale, puisque je suis sur le point de l'améliorer en fonction de la réponse:
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
La solution
SELECT
ISNULL(q.hour, a.hour) AS hour,
ISNULL(questions,0) AS questions,
ISNULL(answers,0) AS answers
Ou réécrire la requête pour se débarrasser de la 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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow