【问题标题】:SUM from the first month of the year until selected month of the year SQL从一年中的第一个月到一年中选定的月份的 SUM SQL
【发布时间】:2015-01-20 04:06:02
【问题描述】:

我有一个大数据可供选择。数据按小时计算。一天有 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 月到 2014 年 3 月的总价值。

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

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 该表有一个字段是身份字段。我没有得到你。 “你能修改表格吗?”
      • 有时人们正在使用他们无法更改的数据库(例如第三方软件),所以我只是确保您可以修改表的 DDL。一定要检查表上的正确索引,它会让你的查询运行得更顺畅。
      猜你喜欢
      • 2021-07-05
      • 1970-01-01
      • 2021-06-30
      • 2019-07-27
      • 2014-11-21
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多