如何连接具有不同 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 级别的两个查询,使一些记录为空的主要内容,如果未能解决你的问题,请参考以下文章
如何在mongodb的单个查询中添加具有不同条件输出的Multiple Group By?
如何使用具有多个 GROUP BY、子查询和 WHERE IN 在大表上的查询来优化查询?