在 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 子句的查询一起使用?