如何连接具有不同 GROUP BY 级别的两个查询,使一些记录为空

Posted

技术标签:

【中文标题】如何连接具有不同 GROUP BY 级别的两个查询,使一些记录为空【英文标题】:How to join two queries with different GROUP BY levels, leaving some records null 【发布时间】:2013-01-27 03:00:39 【问题描述】:

在 MS Access 中,我使用 SQL 将两个查询与内部联接组合在一起,这两个查询都要求用户输入开始日期和结束日期范围。第一个查询(查询 1)列出了退出程序的人数、离开的情况、离开的月份和年份。它是将 Count 函数首先按年份分组,然后按月份分组,然后是离开情况(可以是 5 个选项中的任何一个),这意味着每个月有多个记录(但每个月的记录数不一定相同) )。 第二个查询(查询 2)计算我们已录取的人数、月份和年份。它首先按年分组,然后按月分组。因此,使用此查询,每月只有一条记录。 我的内部联接正确地组合了查询,除了它多次重复查询 2 的值,具体取决于查询 1 的每个月份有多少记录。有没有办法让查询 2 的值每月只列出一次,从而使该月的其余记录为空?

这里是查询1:

SELECT Count(clients.ssn) AS CountOfDepartures, clients.[leaving situation], a.monthname, a.year1, a.month1
FROM clients INNER JOIN (SELECT month(clients.[departure date]) AS Month1, year(clients.[departure date]) AS Year1, months.monthname, clients.ssn FROM clients 
INNER JOIN months ON month(clients.[departure date])=months.monthnumber WHERE clients.[departure date] BETWEEN [Enter Start Date] AND [Enter End Date])  AS A 
ON clients.ssn=a.ssn
GROUP BY a.year1, a.monthname, clients.[leaving situation], a.month1
ORDER BY a.year1 DESC , a.month1 DESC;

这里是查询 2

SELECT Count(clients.ssn) AS CountofIntakes, b.monthname, b.year2, b.month2
FROM clients 
INNER JOIN (SELECT month(clients.prog_start) AS Month2, year(clients.prog_start) AS Year2, months.monthname, clients.ssn 
FROM clients INNER JOIN months ON month(clients.prog_start)=months.monthnumber WHERE clients.prog_start BETWEEN [Enter Start Date] AND [Enter End Date])  AS B 
ON clients.ssn=b.ssn
GROUP BY b.monthname, b.year2, b.month2
ORDER BY b.year2 DESC , b.month2 DESC;

我是这样组合它们的,但它给了我重复的值:

SELECT countofdeparturesbyleavingsituationmonth.countofdepartures, countofdeparturesbyleavingsituationmonth.[leaving situation], countofdeparturesbyleavingsituationmonth.monthname, countofdeparturesbyleavingsituationmonth.year1, countofdeparturesbyleavingsituationmonth.month1, countofintakesbymonth.countofintakes
FROM countofdeparturesbyleavingsituationmonth 
INNER JOIN countofintakesbymonth ON (countofdeparturesbyleavingsituationmonth.monthname=countofintakesbymonth.monthname) AND (countofdeparturesbyleavingsituationmonth.year1=countofintakesbymonth.year2) AND (countofdeparturesbyleavingsituationmonth.monthname=countofintakesbymonth.monthname)
ORDER BY year1 DESC , month1 DESC;

CLIENTS 表为每个客户提供了一个记录,其中包含一组用于不同临床数据的列(我在一家非营利性药物/酒精康复中心工作)。 MONTHS 表只是将十二个月写在一列中,并在第二列中写出相应的数字。我使用 MONTHS 表的内部连接来列出月份名称而不是数字(尽管我刚刚意识到我可能只是在我的报告中使用 MonthName 函数来执行此操作....)。任何建议都非常感谢! 另外,我问这个问题是因为当我对此查询进行报告时,总报告(以及每个日历年)的摄入量的 SUM 值不正确,因为在查询中,每个月都有多个摄入量值。所以 SUM 比它应该的要大得多。除了该问题之外,此查询还会生成正确的报告。

【问题讨论】:

你能贴一些代码吗? 请展示您要合并的两个查询的示例,以及所有相关表的结构。 我刚刚添加了它们。希望这会有所帮助。 【参考方案1】:

你可以使用 DISTINCT 子句:

SELECT DISTINCT
  queryA.people,
  Null as situation,
  queryA.[month],
  queryA.[year]
FROM
  queryA INNER JOIN queryB
  ON (queryA.people=queryB.people)
     AND (queryA.[month]=queryB.[month])
     AND (queryA.[year]=queryB.[year])

【讨论】:

感谢您的帮助! 1)什么是“null as”? 2)Join 只能在月份和年份上,因为正如你所说的“人”实际上是人数,所以他们是数字 3)SELECT 语句中没有 queryB - 这是故意的吗? @tmolloy8 不客气! 1)我不确定这是否是您需要的,情况是别名,我正在返回一个包含所有空值的列 2)加入计数应该不是问题,但是如果发布一些示例数据和预期结果我可以更好地理解您的问题 3)您可以从 queryB 中添加列

以上是关于如何连接具有不同 GROUP BY 级别的两个查询,使一些记录为空的主要内容,如果未能解决你的问题,请参考以下文章

Mysql group by 具有不同的和内部连接

如何在mongodb的单个查询中添加具有不同条件输出的Multiple Group By?

在SQL中分组查询 Group by 的存在条件是啥

如何使用具有多个 GROUP BY、子查询和 WHERE IN 在大表上的查询来优化查询?

如何每天使用 GROUP BY 制作可以出现在两个不同表格中的 COUNT 个项目?

用group by语句时,字段很多并且数据量也很大的情况如何解决?