SQL 查询帮助获取每月值

Posted

技术标签:

【中文标题】SQL 查询帮助获取每月值【英文标题】:SQL Query help getting monthly values 【发布时间】:2015-09-16 14:27:16 【问题描述】:

我有一个查询,它基本上根据几个条件对当前月份的一列求和。我想获得每个月的价值,但似乎无法理解它。

DECLARE @d1 DATETIME = DATEADD(mm, DATEDIFF(mm, 0, GETDATE()),0);
DECLARE @d2 DATETIME = DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) + 1, 0);

SELECT    sum(SUMCOL)   as Total 
FROM COVERAGE
where

(COVERAGE_START_DATE>=@d1 and COVERAGE_START_DATE< @d2 and not PROCESSED_DATE>=@d2)   or

(COVERAGE_START_DATE< @d1 and PROCESSED_DATE>=@d1 and PROCESSED_DATE<@d2)

我只是想得到月份

SELECT MONTH(PROCESSED_DATE)MONTH, sum(SUMCOL) as Total 

然后按月分组…………

GROUP BY  MONTH(COVERAGE_START_DATE)

但后来意识到这不会,因为我也需要处理 PROCESSED_DATE 列并且也无法获取额外的逻辑。

无论如何,我希望能得到一些帮助。显然 SQL 查询不是我的事 :) 必须有一种更有效(和正确)的方法,但我似乎无法理解它。

【问题讨论】:

这将是一个很好的起点。 spaghettidba.com/2015/04/24/… 【参考方案1】:

使用HAVING 子句。

SELECT MONTH(PROCESSD_DATE) AS MONTH, SUM(SUMCOL) AS Total
FROM COVERAGE
GROUP BY MONTH(PROCESSD_DATE)
HAVING ((COVERAGE_START_DATE BETWEEN @d1 AND @d2) AND PROCESSED_DATE <= @d2)
OR (COVERAGE_START_DATE < @d1 AND (PROCESSED_DATE BETWEEN @d1 AND @d2))

【讨论】:

使用上面的例子,我该如何解决 -- HAVING 子句中的“COV.Coverage_Start_Date”列无效,因为它既不包含在聚合函数也不包含在 GROUP BY 子句中。并且列 'COV.Processed_Date' 在 HAVING 子句中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。抱歉,我刚刚开始学习其中的一些内容。

以上是关于SQL 查询帮助获取每月值的主要内容,如果未能解决你的问题,请参考以下文章

sql每月选择前5名

SQL 查询以获取每个位置的“最新”值

Sql 查询以查找缺少的每月付款

按每月的每个周执行SQL查询

SQL查询用于查找用户每月的最大金额[重复]

SQL查询每月每天的前两条数据....