用于合并来自同一个表的两个聚合子集的 SQL 查询

Posted

技术标签:

【中文标题】用于合并来自同一个表的两个聚合子集的 SQL 查询【英文标题】:SQL query to merge two aggregated subsets from the same table 【发布时间】:2011-06-02 03:08:27 【问题描述】:

我写了一个 data.stackexchange 查询来找出what hour of the day a user posts questions and answers。您可以在那里看到 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

【问题讨论】:

【参考方案1】:
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)

【讨论】:

很好地使用CASE!我打算单独接受您对第一部分的回答,但第二部分更好。谢谢!

以上是关于用于合并来自同一个表的两个聚合子集的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

sql 用union合并合并查询结果

SQL 2012 将来自多个表的多个查询与连接和计数合并到一个表中

LINQ to SQL:对来自订购系统的多个表的报告的聚合数据进行复杂查询

尝试合并 SQL 查询的两个结果 - ToDoList App

如何在 mongodb 中聚合子集合并应用 $count 不起作用

SQL——连接查询聚合函数开窗函数