SUM从一年的第一个月到选定的一年中的SQL

时间:2015-01-20 04:06:03

标签: sql sql-server sql-server-2008-r2

我有一个大数据可供选择。数据是按小时计算的。在一天中将有24条记录,因此在一个月内将是24 * 30 = 720条记录。这只适用于一组,我在表中有3组。比方说,A组,B组和C组。所以一个月的总数将是720 * 3 = 2,160条记录 这些数据自2008年以来一直在运行。

目前,我必须计算该表中某个字段的总和。现在让我们说表名是'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)
--========================================

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

有谁知道怎么做?如果我没有使用上面的脚本(为了防止加载大量数据),这很容易,但速度极慢。
谢谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您的表在日期字段中是否有聚集索引?这些数据是递增的,因此它将是一个很好的候选者。这应该真正提高您的查询性能。

你可以修改表格吗?尝试添加持久计算列来表示月/年(Convert date to YYYYMM format),在其上放置索引,然后在查询中使用它。