SQL запрос на объединение двух агрегированных подмножеств с одной и той же таблицей

StackOverflow https://stackoverflow.com/questions/4572490

  •  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     

Как я могу изменить запрос на:

  1. объединить оба часовых столбца в один столбец и
  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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top