【问题标题】:Group by quarter (datepart) returns multiple rows with same quarter按季度分组(日期部分)返回具有相同季度的多行
【发布时间】:2018-07-15 23:01:52
【问题描述】:

我正在尝试返回表 HISTORY 中按季度和年份分组的记录总数。目前我有:

SELECT DISTINCT (CAST(DATEPART(year, CREATE_DATE) AS char) + ' Qtr' + 
                CAST(DATEPART(quarter, CREATE_DATE) AS char)) AS Period,
       COUNT(ID)
FROM HISTORY
GROUP BY CREATE_DATE
ORDER BY Period;

但我得到相同季度和年份的重复行。我还得到计数的总记录数低于表中的总记录数。 Here's a sample sql fiddle 以防万一有助于识别问题。

我也不会认为我需要在句点列中指定 DISTINCT,但是当我不这样做时,我会得到更多的欺骗......我猜这是同一个根本问题的一部分。

【问题讨论】:

  • 仔细看。代码做你写的,而不是你想要的。您按 create_date 分组,以便为​​ create_date 的每个唯一值获得一行。您仅显示由年份和季度组成的值这一事实不会影响您的分组。您需要按年份和季度分组。

标签: sql-server group-by aggregate-functions


【解决方案1】:

问题在于您按 CREATE_DATE 分组,但想按年份和季度分组:

SELECT 
  DATENAME(year, CREATE_DATE) + ' Qtr' + DATENAME(quarter, CREATE_DATE) AS Period,
  COUNT(*) AS NumberOfRecords
FROM HISTORY
GROUP BY DATENAME(year, CREATE_DATE), DATENAME(quarter, CREATE_DATE)
ORDER BY Period;

【讨论】:

  • 我尝试按我命名的列进行分组(就像你可以做 ORDER BY 一样),但这不会计算。我没想到要指定多个值来分组,这对我来说很愚蠢!还要感谢您指出DATENAME 功能!这样可以节省一些空间!
  • @IsaacReefman 按列名排序的唯一原因是它发生在计算结果的最后。分组发生在很久以前,因此您必须在 GROUP BY 子句中重复该公式(这还不错,因为 SQL Server 足够聪明,只对表达式求值一次)。如您所见,按多个值分组并不“愚蠢”,有时它很有用。您想按季度查看记录数,但当然该季度属于一年。按日期分组过于细化。谢谢,很高兴你喜欢它!
猜你喜欢
  • 1970-01-01
  • 2015-07-22
  • 2012-10-19
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多