0

我有一个按月对汇总总和值进行分组的查询。

这是查询:

Declare @IsByStatus bit
Set @IsByStatus = 0

SELECT
    CAST((DATEDIFF(month, '2012-01-01T06:00:00', datTimeStamp)) AS int) AS [Index] ,
    Min(datTimeStamp) as [From],
    Max(datTimeStamp) as [To],
    Sum(CASE CAST(intIO_ID AS nvarchar(100))
             WHEN N'284' THEN Value ELSE NULL END) AS [286]
FROM 
    [IOValuesFn](@IsByStatus) IOValues 
WHERE 
    datTimeStamp >= '2012-01-01T06:00:00' 
    AND datTimeStamp < '2013-01-01T05:59:59'
    AND intIO_ID IN (284)
GROUP BY 
    CAST ((DATEDIFF(Month,'2012-01-01T06:00:00', datTimeStamp)) AS int)
ORDER BY
    [From]

这是结果:

Index   From    To  286
0   2012-01-07 07:00:00.000 2012-01-31 23:00:00.000 142579.898864746
1   2012-02-01 00:00:00.000 2012-02-29 23:00:00.000 139486.498001099
2   2012-03-01 00:00:00.000 2012-03-31 23:00:00.000 99516.3022232056
3   2012-04-01 00:00:00.000 2012-04-30 23:00:00.000 84597.599899292
4   2012-05-01 00:00:00.000 2012-05-31 23:00:00.000 67085.2983112335
5   2012-06-01 00:00:00.000 2012-06-30 23:00:00.000 67768.9982643127
6   2012-07-01 00:00:00.000 2012-07-31 23:00:00.000 121100.264842987
7   2012-08-01 00:00:00.000 2012-08-31 23:00:00.000 165768.90776825
8   2012-09-01 00:00:00.000 2012-09-30 23:00:00.000 97441.7333068848
9   2012-10-01 00:00:00.000 2012-10-31 23:00:00.000 153764.736312866
10  2012-11-01 00:00:00.000 2012-11-30 23:00:00.000 153601.413961411
11  2012-12-01 00:00:00.000 2012-12-31 23:00:00.000 142521.07028389
12  2013-01-01 00:00:00.000 2013-01-01 05:00:00.000 1192.32000732422

现在我想做类似的逻辑,这也会在月份开始结束时间插入一个偏移量。

例如,第一期将从 1 月 1 日上午 11:00 开始,到 2 月 1 日上午 10:59:59 结束。

接下来的每个月也是如此。

提前感谢您的帮助,奥马尔

4

1 回答 1

3

看看下面的例子。诀窍是添加负偏移量,这样当月第一天上午 11 点之前的任何小时都被“推”到上个月。

架构设置

create function iovaluesfn(@isbystatus bit) returns table as return
select datTimeStamp = '20130101 10:50', intIO_ID = 284, Value = 1 union all
select '20130101 11:00', 284, 1 union all
select '20130102 11:00', 284, 2 union all
select '20130301 11:00', 284, 3 union all
select '20130401 11:00', 284, 4 union all
select '20120501 11:00', 284, 5 union all
select '20120601 11:00', 284, 6 union all
select '20120101 11:00', 284, 7 union all
select '20120102 11:00', 284, 8 union all
select '20120101 11:01', 284, 9 union all
select '20120101 10:59', 284,10 union all  -- ** this value is counted in Dec 2011
select '20120101 11:00', 284,11 union all
select '20120101 11:01', 281,12 union all
select '20120101 10:59', 281,13 union all
select '20120101 11:00', 281,14
GO

查询

Declare @IsByStatus bit;
Set @IsByStatus = 0;

;with IOValues as (
  select DATEADD(hour, -11, datTimeStamp) datTimeStamp, intIO_ID, Value
    FROM [IOValuesFn](@IsByStatus)
   WHERE datTimeStamp >= '2012-01-01T06:00:00' AND datTimeStamp < '2013-01-01T05:59:59'
     AND intIO_ID IN (284)
)
  SELECT CAST((DATEDIFF(month,'2012-01-01T06:00:00',datTimeStamp)) AS int) AS [Index],
         Min(datTimeStamp) as [From],
         Max(datTimeStamp) as [To],
         Sum(CASE CAST(intIO_ID AS nvarchar(100))
             WHEN N'284' THEN Value ELSE NULL END) AS [286]
    FROM IOValues
GROUP BY CAST ((DATEDIFF(Month,'2012-01-01T06:00:00',datTimeStamp))AS int)
order by [From];

结果

| INDEX |              FROM |                TO | 286    |
----------------------------------------------------------
|    -1 | December, 31 2011 | December, 31 2011 |  10*** |
|     0 |  January, 01 2012 |  January, 02 2012 |  35    |
|     4 |      May, 01 2012 |      May, 01 2012 |   5    |
|     5 |     June, 01 2012 |     June, 01 2012 |   6    |

SQL 小提琴演示

于 2013-04-25T08:28:38.683 回答