【问题标题】:SELECT number of groups resulted from a GROUP BY querySELECT GROUP BY 查询产生的组数
【发布时间】:2015-11-26 08:48:54
【问题描述】:

我尝试了以下查询来选择由 GROUP BY 查询产生的组数:

SELECT count(*)
FROM (
        SELECT count(*)
        FROM MyTable
        WHERE Col2 = 'x'
        GROUP BY Col1
     )

很遗憾,此查询无效:Incorrect syntax near ')'.

注意:我只想得到一行(我已经找到了 n 倍结果的解决方案,其中 n = 组数)。

【问题讨论】:

  • 只需在内部查询中为您的 count(*) 提供一个别名,它应该可以工作。
  • 请否决投票者详细说明,如果需要,我当然很乐意改进问题,谢谢。

标签: sql sql-server tsql sql-server-2014


【解决方案1】:
SELECT COUNT(*)
FROM (
    SELECT value = COUNT(*)
    FROM MyTable
    WHERE Col2 = 'x'
    GROUP BY Col1
) е

但我认为 - 你需要尝试这个查询 -

SELECT COUNT(DISTINCT Col1)
FROM MyTable
WHERE Col2 = 'x'

【讨论】:

  • 正在寻找这个答案,希望在没有子查询的情况下使用并了解 COUNT DISTINCT,从而消除了对 GROUP BY 的需求。不幸的是,这种方法仅适用于简单的分组,这不是我的情况,涉及在多个 JOIN 上使用聚合表达式。我想知道如果不能消除,是否还有一种方法可以对 GROUP BY 进行一级查询?
【解决方案2】:
SELECT count(*)
FROM (
        SELECT 1 as dummy
        FROM MyTable
        WHERE Col2 = 'x'
        GROUP BY Col1
     ) dt

子查询不用计算行数,反正结果都是一样的。

【讨论】:

  • 你是第一个,谢谢,这行得通。有什么问题?为什么为列定义别名如此重要? (请注意,我是否计算子查询中的行数并不重要,别名是重要的东西)。
  • 我认为这是 MS SQL Server 的事情。不知道为什么。您的查询符合 ANSI SQL。
  • 好的,谢谢。会尽快接受您的回答(还有 9 分钟)。
  • 或者看看下面德瓦特的回答。
  • @QmlnR2F5,它是一个表别名,是子查询的名称。通常是可选的,但某些 dbms 产品需要它。
【解决方案3】:

你必须为列和表命名...

SELECT count(*) Total
FROM (
        SELECT count(*) Groups
        FROM MyTable
        WHERE Col2 = 'x'
        GROUP BY Col1
     ) a

【讨论】:

    猜你喜欢
    • 2020-08-15
    • 2018-09-07
    • 2011-01-29
    • 1970-01-01
    • 2022-01-03
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    相关资源
    最近更新 更多