【问题标题】:Calculate YTD, Previous YTD in the same query在同一查询中计算 YTD、Previous YTD
【发布时间】:2019-03-20 15:46:35
【问题描述】:

如何在同一个查询中计算 YTD 和之前的 YTD?

我尝试计算重量和 ytd 的重量。我不明白如何在同一个查询中添加先前 ytd 的计算。

  • YTD:从 1 月 1 日到今天的总重量
  • 年初至今:总和 从去年 1 月 1 日到今天的体重减去 1 年


SELECT SUM(CASE
                   WHEN convert(date,s.Delivery_Year+'-'+ s.Delivery_month+'-'+ s.Delivery_day) BETWEEN dateadd(yy, DATEDIFF(yy, 0, GETDATE()), 0) AND GETDATE() THEN s.Weight
                   ELSE 0
               END) AS WeightYTD ,
           sum(Weight) AS weight ,
           [Sales_Organization] ,
           [Market_Grp] ,
           [Delivery_Year] ,
           [Delivery_month] ,
           Delivery_day
    FROM Fact_sales s
    GROUP BY ,
                      [Sales_Organization] ,
                      [Market_Grp] ,
                      [Delivery_Year] ,
                      [Delivery_month] ,
                      Delivery_day

【问题讨论】:

  • 您选择了所有日期的所有数据,然后按年、月和日期分组。因此,您的输出结果将包括去年和今年的行。去年的行在他们的年初至今列中应该有什么? (例如,取今天的日期20th March 2019,您还将有一个21st March 2018 的输出行,该行的年初至今列是否应该显示 2019 年年初至今的值?)
  • @MatBailie 不应该
  • 那么请编辑您的问题,更新它的详细信息,涵盖您想要的所有行为。

标签: sql tsql sql-server-2008


【解决方案1】:

目前还不清楚您真正想要什么结果/行为。

一种可能的解释是“年初至今”是相对于表中的日期,而不是相对于“今天”/GETDATE()

所以...

  • 对于14th March 2018:年初至今 = 1st Jan 201814th March 2018
  • 对于20th March 2019:年初至今 = 1st Jan 201920th March 2019

既然如此,我将执行以下操作以获取YTD 列...

WITH
    grouped_by_date AS
(
    SELECT
        [Sales_Organization],
        [Market_Grp],
        [Delivery_Year],
        [Delivery_Month],
        [Delivery_Day],
        SUM([Weight])             AS Weight
    FROM
        Fact_sales s
    GROUP BY
        [Sales_Organization],
        [Market_Grp],
        [Delivery_Year],
        [Delivery_Month],
        [Delivery_Day]
),
    cumulative_sum_for_ytd AS
(
    SELECT
        *,
        SUM([Weight]) OVER (PARTITION BY [Delivery_Year]
                                ORDER BY [Delivery_Month], [Delivery_Day]
                           )
                              AS Weight_YTD
    FROM
        grouped_by_date
),

SQL Server 2008 中没有 LAG() 函数,但有可以模拟它的“hacky 技巧”...

    hack_to_do_lag AS
(
    SELECT
        *,
        CASE
            WHEN [Delivery_Year]%2=1
            THEN MAX(CASE WHEN [Delivery_Year]%2=0 THEN [Weight_YTD] END) OVER (PARTITION BY ([Delivery_Year]+0)/2)
            ELSE MAX(CASE WHEN [Delivery_Year]%2=1 THEN [Weight_YTD] END) OVER (PARTITION BY ([Delivery_Year]+1)/2)
        END
            AS Weight_PreviousYTD
    FROM
        cumulative_sum_for_ytd
)
SELECT
    *
FROM
    hack_to_do_lag

【讨论】:

  • 这部分代码抛出错误 SUM([Weight]) OVER (PARTITION BY [Delivery_Year] ORDER BY [Delivery_Month], [Delivery_Day]-----this part ) AS Weight_YTD
  • @testtest 1)。您更改了代码,因此您的问题并未反映您如何测试它。 2)。您没有包含错误消息。 Please update your question with the exact code you tested and the exact error message you received.
  • Msg 102, Level 15, State 1, Line 26 'order' 附近的语法不正确。
  • @testtest Please update your question with the exact code you tested
  • 这部分代码抛出错误 SUM([Weight]) OVER (PARTITION BY [Delivery_Year] ORDER BY [Delivery_Month], [Delivery_Day]-----this part ) AS Weight_YTD --- -------- Msg 102, Level 15, State 1, Line 26 'order' 附近的语法不正确。
猜你喜欢
  • 1970-01-01
  • 2022-10-14
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 2022-08-17
  • 2011-11-04
  • 1970-01-01
相关资源
最近更新 更多