SQL запрос на объединение двух агрегированных подмножеств с одной и той же таблицей
-
14-10-2019 - |
Вопрос
Я написал запрос Data.StackexChange, чтобы узнать Какой час дня пользователь публикует вопросы и ответы. Анкет Вы можете увидеть SQL там. Результаты прямо сейчас выглядят так:
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
Как я могу изменить запрос на:
- объединить оба часовых столбца в один столбец и
- Если вопросы/ответы
null
, установлен в0
вместо.
Часть 2 является низким приоритетом.
Редактировать: Вот полный SQL оригинального запроса, так как я собираюсь улучшить его на основе ответа:
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
Решение
SELECT
ISNULL(q.hour, a.hour) AS hour,
ISNULL(questions,0) AS questions,
ISNULL(answers,0) AS answers
Или переписать запрос, чтобы избавиться от 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)
Не связан с StackOverflow