【问题标题】:GROUP BY with a condition on WHERE clause带有 WHERE 子句条件的 GROUP BY
【发布时间】:2021-06-06 15:28:41
【问题描述】:

我有以下疑问:

SELECT
  Group     as [Grupo],
  COUNT(*)  as [Total]
FROM
  Table
WHERE
  Status NOT IN ('Closed', 'Cancelled', 'Resolved') AND
  DATEDIFF(day,Submit_Date,GETDATE()) > 30
GROUP BY
  Group,
  DATEDIFF(day,Submit_Date,GETDATE())

目标是获得时效超过 30 天的门票。输出是:

Group       Total
Group A         4
Group A         1
Group A         2
Group A         2
Group B         1
Group B         1

我希望看到的:

Group       Total
Group A         9
Group B         2

我可能在这里遗漏了一些愚蠢的东西......有人可以帮我解决这个问题吗?谢谢

【问题讨论】:

  • 我不知道你为什么在 group by 中有DATEDIFF,你只是按“Group”分组

标签: sql sql-server-2008 group-by


【解决方案1】:

似乎您只需要按“组”分组:

SELECT
  Group     as [Grupo],
  COUNT(*)  as [Total]
FROM
  Table
WHERE
  Status NOT IN ('Closed', 'Cancelled', 'Resolved') AND
  DATEDIFF(day,Submit_Date,GETDATE()) > 30
GROUP BY
  Group

【讨论】:

  • 比彗星还快。谢谢。你成功了!
【解决方案2】:

您需要修复GROUP BY。这些键定义每一行,显然您希望每个 group 有一行。

我还建议修复日期逻辑:

SELECT [Group] as [Grupo], COUNT(*)  as [Total]
FROM  Table
WHERE Status NOT IN ('Closed', 'Cancelled', 'Resolved') AND
      Submit_Date < DATEADD(DAY, -30 CONVERT(DATE, GETDATE()))
GROUP BY [Group];

避免对Submit_Date 的函数调用应该有助于优化器生成最佳执行计划。

【讨论】:

    猜你喜欢
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 2014-08-30
    相关资源
    最近更新 更多