在 SQL 查询中一起使用 union 和 count(*)

Posted

技术标签:

【中文标题】在 SQL 查询中一起使用 union 和 count(*)【英文标题】:Using union and count(*) together in SQL query 【发布时间】:2010-11-18 23:53:24 【问题描述】:

我有一个 SQL 查询,看起来像这样:

select name, count (*) from Results group by name order by name

另一个,从存档结果表加载的相同,但字段相同。

select name, count (*) from Archive_Results group by name order by name

如何将两者结合到一个查询中? (所以 group by 仍然可以正常工作)。我尝试使用 union all,但它不起作用。我错过了什么?

【问题讨论】:

【参考方案1】:
SELECT tem.name, COUNT(*) 
FROM (
  SELECT name FROM results
  UNION ALL
  SELECT name FROM archive_results
) AS tem
GROUP BY name
ORDER BY name

【讨论】:

谢谢。我所缺少的只是“as tem”部分......忘记了我必须命名我创建的“表”才能使其正常工作。 这会给出错误的答案。事实上,它会为每个名称计数 1,因为默认情况下 UNION 是 UNION DISTINCT。使用 UNION ALL。 谢谢 Steve Kass,但是我已经知道我需要使用 UNION ALL。如上所述,我所缺少的是“as”一词。 @Rekreativc:没问题。我发表评论是因为您将解决方案标记为最佳答案,并且我不希望未来的读者认为这是一个正确的答案。【参考方案2】:

如果您有支持索引,并且计数相对较高,则这样的方法可能比建议的解决方案快得多:

SELECT name, MAX(Rcount) + MAX(Acount) AS TotalCount
FROM (
  SELECT name, COUNT(*) AS Rcount, 0 AS Acount
  FROM Results GROUP BY name
  UNION ALL
  SELECT name, 0, count(*)
  FROM Archive_Results
  GROUP BY name
) AS Both
GROUP BY name
ORDER BY name;

【讨论】:

仅供参考,我将“两者”作为保留字。 mysql 5.1(顺便说一句) 我认为 SUM(Count) 也可以使用,而不是维护两列。【参考方案3】:

你的目标是……

    统计所有“Bob”实例 两个表格中的“琼斯”(例如) 统计所有“Bob”实例 琼斯”在Results 在一排和 “鲍勃琼斯”的所有实例 Archive_Results 在单独的行中?

假设它是 #1,您会想要...

SELECT name, COUNT(*) FROM
(SELECT name FROM Results UNION ALL SELECT name FROM Archive_Results)
GROUP BY name
ORDER BY name

【讨论】:

案例2呢? 对于#2,您最好只运行两个查询并将它们合并到软件中。但是,如果您绝对必须将两者结合起来,您也可以只使用 SELECT name, COUNT(1) FROM Results GROUP BY name UNION SELECT name, COUNT(1) FROM Archive_Results【参考方案4】:
select T1.name, count (*)
from (select name from Results 
      union 
      select name from Archive_Results) as T1
group by T1.name order by T1.name

【讨论】:

你的回答对前面的回答有什么补充?

以上是关于在 SQL 查询中一起使用 union 和 count(*)的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:如何将 UNION 与两个都有 WHERE 子句的查询一起使用?

与 UNION 一起使用时,对每个 SQL Server 查询都不起作用的排序

mysql 将两个SQL语句查询结果并在一起

sql server 中union的用法

SQL高级查询基础

SQL高级查询技巧