【问题标题】:calculate monthly and twelve last date in the same row计算同一行中的每月和十二个最后日期
【发布时间】:2020-11-17 13:56:33
【问题描述】:

我有餐桌销售

Activity | Sector | dateSale | Amount
CREATE TABLE sales
(Activity nvarchar(100) ,
Sector    nvarchar(100) ,
dateSale  date ,
Amount as float )

我需要在同一行中计算每月和上个月十二月的日期: 预期结果例如:

Activity | Sector | AmountMonth | AmountLTD

我试图计算一个月的金额

declare @date as date,
set @date ='17-11-2020'----- I should to calculate amount in the previous month of the date parameter: all october for the same year 
SELECT SUM(Amount)
      ,Activity
      ,Sector 
FROM sales
WHERE [dateSale] between DATEADD(MONTH, DATEDIFF(MONTH, 0, @date)-1, 0)
                     and DATEADD(MONTH, DATEDIFF(MONTH, -1, @date)-1, -1)
group by Activity
        ,Sector 

我尝试在 LTD 中计算金额,但它是错误的,我需要更正它:

 declare @date as date,
    set @date ='17-11-2020'----- I should to calculate amount in the ltd of the date parameter Ineed to calculate from november 2019 to october 2020
    SELECT SUM(Amount)
          ,Activity
          ,Sector 
    FROM sales
    WHERE [dateSale] between DateAdd(DAY,-Day(@Date)+1,@Date)
                         and DateAdd(MONTH,-13,@DateR2)
    group by Activity
            ,Sector 

请问如何在同一行进行计算?有没有其他简单的计算方法?

【问题讨论】:

  • 您能否将一些测试数据和该测试数据的所需输出添加到您的问题中,最好是 create table 语句?
  • 谢谢。理想情况下,您的表格脚本会附带一些测试数据和基于我之前提到的数据的所需输出。

标签: sql sql-server sql-server-2012


【解决方案1】:

如果您想要每个月以及过去 12 个月的金额,则需要分别计算总和。从您的问题中不清楚您想要输出的确切方式,但希望以下内容会有所帮助。它在内部查询中计算每个月的总和,并在外部查询中附加尾随的 12。

SELECT s.Activity, s.Sector, s.StartOfMonth, s.AmountMonth, SUM(salesLtd.Amount) [AmountLTD]
FROM (
    SELECT Activity, Sector, SUM(Amount) [AmountMonth], StartOfMonth
    FROM sales 
    CROSS APPLY (SELECT DATEADD(month, DATEDIFF(month, 0, dateSale), 0) [StartOfMonth]) [forStart]
    GROUP BY Activity, Sector, StartOfMonth
) s
INNER JOIN sales salesLtd ON salesLtd.dateSale <= EOMONTH(s.StartOfMonth) 
    AND salesLtd.dateSale >= DATEADD(year, -1, s.StartOfMonth)
GROUP BY s.Activity, s.Sector, s.StartOfMonth, s.AmountMonth

我本可以使用 CTE 来构造内部查询,然后在外部查询的连接中使用相同的 CTE(大概是为了利用已经聚合的数据),但我怀疑它实际上会更慢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    相关资源
    最近更新 更多