consulta SQL para fusionar dos subconjuntos agregados de la misma tabla
-
14-10-2019 - |
Pregunta
Me escribió una consulta para averiguar data.stackexchange a qué hora del día un usuario publica preguntas y respuestas . Se puede ver el SQL allí. Los resultados en este momento se ven así:
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
¿Cómo puedo modificar la consulta a:
- fusionar ambas columnas hora en una sola columna, y
- Si preguntas / respuestas son
null
, listo para0
lugar.
Parte 2 es baja prioridad.
Editar : Aquí está el SQL completa de la consulta original, ya que estoy a punto de mejorarlo en base a la respuesta:
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
Solución
SELECT
ISNULL(q.hour, a.hour) AS hour,
ISNULL(questions,0) AS questions,
ISNULL(answers,0) AS answers
O reescribir la consulta para deshacerse 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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow