从一年中的第一个月到一年中选定月份的总和 SQL

SUM from the first month of the year until selected month of the year SQL

我有一个大数据要select。数据是按小时计算的。一天是 24 条记录,所以一个月是 24 * 30 = 720 条记录。这仅适用于一组,我在 table 中有 3 个组。假设 A、B 和 C 组。那么一个月的总数为 720 * 3 = 2,160 条记录。
该数据自 2008 年以来一直 运行。

目前,我必须计算 table 中其中一个字段的总数。现在假设 table 名称是 'oTable'。我有以下 t-sql:

;WITH ff AS (
  SELECT GroupCode, 
  DateAdd(hh,-1,DateAdd(hh,DatePart(hh,myTime),myDate)) AS newDate, Value
  FROM oTable
  )
SELECT GroupCode, CAST(newDate AS DATE) AS MainDate, SUM(Value)
FROM ff
GROUP BY GroupCode, CAST(newDate AS DATE)

它将在第二天计算从01:00:00到00:00:00的值。每天都会有一个基础数据。

为了防止加载太多数据,我使用了这个 t-sql:

--=========================================
DECLARE @date DATE;
DECLARE @MonthID int = 3;
DECLARE @Year int = 2014;

SELECT @date = Cast (CONVERT(VARCHAR(4), @Year) + '-' + CONVERT(VARCHAR(2), @MonthID) + '-01' AS DATE)

SELECT GroupCode, myDate, myTime, Value 
INTO #TempTable
FROM oTable
WHERE myDate BETWEEN Dateadd(day, -1, @date) AND Dateadd(day, 1, Dateadd(day, -Day(@date), Dateadd(month, 1, @date)))

;WITH ff AS (
      SELECT GroupCode, 
      DateAdd(hh,-1,DateAdd(hh,DatePart(hh,myTime),myDate)) AS newDate, Value
      FROM #TempTable
      )
    SELECT GroupCode, CAST(newDate AS DATE) AS MainDate, SUM(Value)
    FROM ff
    GROUP BY GroupCode, CAST(newDate AS DATE)
--========================================

我的问题是,我想根据参数计算从年初开始的 'value' 的总数。比方说,参数是 @monthid = '3' 和 @year = '2014'...我需要知道从 2014 年 1 日到 2014 年 3 日的总价值。

有人知道怎么做吗?如果我没有使用上面的脚本(以防止加载太多数据),这很容易,但非常慢。
谢谢。

DECLARE @date1 DATE;
DECLARE @date2 DATE;
DECLARE @MonthID int = 3;
DECLARE @Year int = 2014;
SELECT @date1=DATEADD(DAY,-1,DATEADD(MONTH,1,CAST(CAST(@MonthID AS VARCHAR)+'/01/'+CAST(@Year AS VARCHAR)AS DATE)))
SELECT @date2=CAST('01/01/'+CAST(@Year AS VARCHAR)AS DATE)
SELECT @date1,@date2


SELECT SUBSTRING(CONVERT(VARCHAR,myDate,113),4,8) MonthYear,GroupCode,SUM(Value)
FROM oTable
WHERE myDate BETWEEN @Date2 AND @Date1
GROUP BY SUBSTRING(CONVERT(VARCHAR,myDate,113),4,8),GroupCode

您的 table 在日期字段上是否有聚簇索引?该数据是增量的,因此它将是一个很好的候选者。那应该真正提高查询的性能。

你能修改table吗?尝试添加一个持久计算列来表示 month/year (Convert date to YYYYMM format),在其上放置一个索引,然后在您的查询中使用它。