如果字段的日期为周末,则SQL Server 2014的总和值

时间:2018-09-18 17:24:21

标签: sql-server-2014

我正在创建一个存储过程,它将从今年和前一年提取值。如果需要使用当年的日期,则需要将值归入周末到周末之前或周末之后的值。

目前,这是我的查询:

SELECT *
FROM
(
    SELECT 
        CAST(@PassedString AS datetime) AS SelectedMonth,

        SUM(CASE WHEN Year(PD.PDate) = @CurrYear THEN 
        ISNULL(PD.PQO, PD.PQty) END) AS CurrQty,

        SUM(CASE WHEN Year(PD.PDate) = @PrevYear THEN 
        ISNULL(PD.PQO, PD.PQty) END) AS PrevQty,

        CAST(DATEPART(day, PD.PDate) AS varchar(50)) + '-' + 
        CAST(CONVERT(varchar(3), DATENAME(month, PD.PDate)) AS 
        varchar(3)) AS PDayMonth,

        CAST(CONVERT(varchar(3), DATENAME(month, PD.PDate)) AS 
        varchar(3)) AS PMonth,

        CAST(DATEPART(day, PD.PDate) AS int) AS PDay
    FROM TableXYZ AS PD
    WHERE DATEPART(month, PD.PDate) = @getMonth
          AND DATEPART(year, PD.PDate) IN (@CurrYear, @PrevYear)
    GROUP BY CAST(DATEPART(day, PD.PDate) AS int), 
          CAST(CONVERT(varchar(3), DATENAME(month, PD.PDate)) AS varchar(3))
) AS PQtyGroup

结果如下:

SelectedMonth           CurrQty PrevQty DayMo   Mon Date
------------------------------------------------------
2018-08-01 00:00:00.000 146231  150873  1-Aug   Aug 1
2018-08-01 00:00:00.000 143712  155624  2-Aug   Aug 2
2018-08-01 00:00:00.000 139729  141820  3-Aug   Aug 3
2018-08-01 00:00:00.000 43075   141318  4-Aug   Aug 4
2018-08-01 00:00:00.000 17303   52898   5-Aug   Aug 5
2018-08-01 00:00:00.000 139725  17336   6-Aug   Aug 6
2018-08-01 00:00:00.000 146914  136205  7-Aug   Aug 7
2018-08-01 00:00:00.000 146662  147549  8-Aug   Aug 8
2018-08-01 00:00:00.000 148166  139434  9-Aug   Aug 9
2018-08-01 00:00:00.000 130704  149717  10-Aug  Aug 10
  1. 如何排除今年的周末?如果我使用类似下面的内容,由于它是2017年的星期五,它将仍然显示2018年8月4日:

     WHERE ((DATEPART(dw, PD.PDate) + @@DATEFIRST) % 7) NOT IN (0, 1)
    
  2. 假设当前年份为2018年,上一年为2017年。2018年8月4日至5日为周末。对于8月4日,它必须加到上一个日期(8月3日)和8月5日到8月6日。但是,对于上一年,需要将8月4日和5日都加到8月6日的值上(请参见下文)。我一直在为此绞尽脑汁,做了一些研究,但发现没有任何用处。

我希望最终输出像这样:

 CurrQty    2018     PrevQty
 ---------------------------
 146231     1-Aug    150873
 143712     2-Aug    155624
 182801     3-Aug    141820 *CurrQty: Aug 3 + Aug 4
 157028     6-Aug    211522 *CurrQty: Aug 5 + Aug 6; PrevQty: Aug 4 + 5 + 6
 146914     7-Aug    136205
 146662     8-Aug    147549
 148166     9-Aug    139434
 130704     10-Aug   149717

感谢您的帮助!谢谢!

0 个答案:

没有答案