【问题标题】:Selecting Sum of the Count From Tables in a DB从数据库中的表中选择计数的总和
【发布时间】:2011-07-13 18:17:16
【问题描述】:

我有以下疑问:

SELECT SUM(count) 
  FROM (SELECT 'artist' AS table_name, COUNT(*) as count FROM artist
        UNION
        SELECT 'persons' AS table_name, COUNT(*) as count FROM persons
        UNION
        SELECT 'track' AS table_name, COUNT(*) as count FROM track)

它按预期工作并返回正确的计数。但是现在当我执行以下查询时,我得到了不正确的计数:

SELECT SUM(count) 
  FROM (SELECT COUNT(*) as count FROM artist
        UNION
        SELECT COUNT(*) as count FROM persons
        UNION
        SELECT COUNT(*) as count FROM track)

为什么第一个查询得到正确的计数而第二个没有?

【问题讨论】:

  • 你能解释一下“不正确的计数”吗?如果不是您期望的总和,您能确定它在计数吗?
  • 它只返回两个计数。正如@Joe Stefanelli 指出的那样,这是由于在 UNION 中消除了计数

标签: sql count union


【解决方案1】:

UNION 消除了重复值,因此如果两个计数碰巧相同,则消除一个,只求和一个。尝试改用UNION ALL

SELECT sum(count) FROM
(SELECT COUNT(*) as count FROM artist
UNION ALL
SELECT COUNT(*) as count FROM persons
UNION ALL
SELECT COUNT(*) as count FROM track)

【讨论】:

  • 哦,哇,很明显,我必须努力不忘记基本 SQL 哈哈。非常感谢!!。
【解决方案2】:

如果您可以接受近似值,只需一次性计算所有表格

SELECT
   Total_Rows= SUM(st.row_count)
FROM
   sys.dm_db_partition_stats st
WHERE
   (index_id < 2) --cover both heaps and clustered indexes
   AND
   OBJECT_SCHEMA_NAME (object_id) <> 'sys' --ignore system stuff

这将立即运行

采用您的原创,您可以一次获得每张桌子和整体的计数..

SELECT
    *,
    SUM(count) OVER () AS GrandTotal
FROM (SELECT 'artist' AS table_name, COUNT(*) as count FROM artist
    UNION
    SELECT 'persons' AS table_name, COUNT(*) as count FROM persons
    UNION
    SELECT 'track' AS table_name, COUNT(*) as count FROM track)

【讨论】:

    【解决方案3】:

    它怎么不准确?一种方法可能是因为在第二个查询中,您使用了UNION,并且两行或多行包含相同的值——因为UNION 删除了重复值。试试UNION ALL,它会返回所有行,而不仅仅是唯一的行。

    【讨论】:

      猜你喜欢
      • 2019-11-20
      • 2018-05-19
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 2023-03-08
      • 2012-10-05
      • 1970-01-01
      相关资源
      最近更新 更多