【问题标题】:Count different groups in the same query计算同一查询中的不同组
【发布时间】:2019-03-19 11:09:07
【问题描述】:

想象一下我有一张这样的桌子:

#   |   A   |   B   |   MoreFieldsHere
1       1       1
2       1       3
3       1       5
4       2       6
5       2       7
6       3       9

B 以 1:n 的关系与 A 相关联。例如,可以使用连接创建表。

我想同时获得总计数和不同 A 的计数。
我知道我可以使用这样的查询:

SELECT v1.cnt AS total, v2.cnt AS num_of_A
FROM
(
    SELECT COUNT(*) AS cnt
    FROM SomeComplicatedQuery
    WHERE 1=1
          -- AND SomeComplicatedCondition
) v1,
(
    SELECT COUNT(A) AS cnt
    FROM SomeComplicatedQuery
    WHERE 1=1
      -- AND SomeComplicatedCondition
    GROUP BY A
) v2

但是SomeComplicatedQuery 将是一个复杂而缓慢的查询,SomeComplicatedCondition 在这两种情况下都是相同的。我想避免不必要地调用它。除此之外,如果查询发生更改,您还需要确保在其他地方也进行更改,使其容易出错并创建(可能是不必要的)工作。

有没有办法更有效地做到这一点?

【问题讨论】:

  • “有没有办法更有效地做到这一点?”WHERE 更有效率?首先是删除1=1,因为这只是浪费编译器的时间。接下来是WHERE 所说的份额,因此我们可以帮助使其表现更好。另外,如果 "SomeComplicatedCondition" 相同,为什么不在同一语句中使用 COUNT(*)COUNT(A)?
  • 嗯,那里是由 .net 代码动态构建的。可能有不同数量的条件,包括0,这就是为什么所有条件都在它们前面添加AND。 1=1 的东西更容易处理。 Count(A) 也会计算 A 不是 NULL 的每一行,而不是不同的 A

标签: sql sql-server select group-by count


【解决方案1】:

你在找这个吗?

SELECT COUNT(*) AS total, COUNT(DISTINCT A) AS num_of_A
FROM (. . . ) q

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多