(Teradata) 获取前 12 个月、3 个月和 1 个月的 SUM 值

Posted

技术标签:

【中文标题】(Teradata) 获取前 12 个月、3 个月和 1 个月的 SUM 值【英文标题】:(Teradata) Get a SUM value of previous 12 months, 3 months and 1 month 【发布时间】:2019-10-24 13:47:52 【问题描述】:

我有一个正在使用的查询,我需要获取前 12 个月、3 个月和上个月的值,但不知道该怎么做。

我目前的查询如下:

select top 100 
A.invoice_nbr
, A.invoice_date
, A.ship_from_dc_nbr
, A.ship_to_store_nbr
, A.trailer_id
, B.item_nbr
, C.old_nbr
, C.whpk_qty
, C.vnpk_qty
, C.item_type_code
, D.po_type
, SUM(B.each_ship_qty) as each_ship_qty
, SUM(B.variable_wt_qty) as variable_wt_qty
, SUM(B.ext_cost_amt) as ext_cost_amt
from DB.DC_INVOICE A
inner join DB.DC_INVOICE_LINE B ON A.invoice_nbr = B.invoice_nbr and A.invoice_date = B.invoice_date and A.ship_to_store_nbr = B.ship_to_store_nbr
inner join DB.item C on B.item_nbr = C.item_nbr
left join DB.purchase_order D on B.po_nbr = D.po_nbr
--where A.invoice_date = '2019-09-05' and A.ship_from_dc_nbr = 6011
group by 
A.invoice_nbr
, A.invoice_date
, A.ship_from_dc_nbr
, A.ship_to_store_nbr
, A.trailer_id
, B.item_nbr
, C.old_nbr
, C.whpk_qty
, C.vnpk_qty
, C.item_type_code
, D.po_type

我尝试为“12 个月”添加以下内容作为另一列:

(SELECT SUM(vnpk_qty)
    FROM DB.item C
    inner join DB.DC_INVOICE_LINE B ON B.item_nbr = C.item_nbr
    inner join DB.DC_INVOICE A ON A.invoice_nbr = B.invoice_nbr and A.ship_to_store_nbr = B.ship_to_store_nbr and BETWEEN DATEADD(dd, A.invoice_date,-365) AND  DATEADD(dd, A.invoice_date,-1)
    )

但是这给了我错误:

[Teradata][ODBC Teradata Driver][Teradata Database] Syntax error: expected something between the 'and' keyword and the 'BETWEEN' keyword.

任何关于如何获取我正在寻找的数据的建议将不胜感激。

【问题讨论】:

Past 12, 3, 1 month 基于什么?日历日期?您的数据中有某种日期?样本数据和期望的结果在这里会有很大帮助。您收到的语法错误是因为您需要指定介于 - A.ship_to_store_nbr = B.ship_to_store_nbr and <some column> BETWEEN ... 之间的内容。最后,dateadd 不是 Teradata 函数。 样本数据和期望的结果会有所帮助。还需要您对“前 个月”的定义。是每行吗?这与当前日期有关吗?那是日历月吗? 字段日期是 A.invoice_date,之前的“x 个月”是相对于 current_date @Andrew @gordonlinoff 每一行都是一个项目,前一行是从当前日期开始,该字段上个月 12 的总和 @lecarusin,在这种情况下,Ravioli 的条件聚合是正确的基本方法。我仍然不知道它是否真的会给你你想要的(因为我们不知道你想要什么)。 【参考方案1】:

您可以使用条件聚合逻辑和ADD_MONTHS 函数。大致思路如下:

SELECT 
  SUM(
    CASE WHEN A.invoice_date > ADD_MONTHS(CURRENT_DATE, -12) THEN vnpk_qty END
  ) AS sum_12month,
  SUM(
    CASE WHEN A.invoice_date > ADD_MONTHS(CURRENT_DATE, -3) THEN vnpk_qty END
  ) AS sum_3month,
  SUM(
    CASE WHEN A.invoice_date > ADD_MONTHS(CURRENT_DATE, -1) THEN vnpk_qty END
  ) AS sum_1month
FROM DB.DC_INVOICE A

所以对于您的查询,它看起来像:

select top 100 
A.invoice_nbr
, A.invoice_date
, A.ship_from_dc_nbr
, A.ship_to_store_nbr
, A.trailer_id
, B.item_nbr
, C.old_nbr
, C.whpk_qty
, C.vnpk_qty
, C.item_type_code
, D.po_type
, SUM(B.each_ship_qty) as each_ship_qty
, SUM(B.variable_wt_qty) as variable_wt_qty
, SUM(B.ext_cost_amt) as ext_cost_amt
-- New fields
SUM(
  CASE WHEN A.invoice_date > ADD_MONTHS(CURRENT_DATE, -12) THEN C.vnpk_qty END
) AS sum_12month,
SUM(
  CASE WHEN A.invoice_date > ADD_MONTHS(CURRENT_DATE, -3) THEN C.vnpk_qty END
) AS sum_3month,
SUM(
  CASE WHEN A.invoice_date > ADD_MONTHS(CURRENT_DATE, -1) THEN C.vnpk_qty END
) AS sum_1month
-- End new fields
from DB.DC_INVOICE A
inner join DB.DC_INVOICE_LINE B ON A.invoice_nbr = B.invoice_nbr and A.invoice_date = B.invoice_date and A.ship_to_store_nbr = B.ship_to_store_nbr
inner join DB.item C on B.item_nbr = C.item_nbr
left join DB.purchase_order D on B.po_nbr = D.po_nbr
--where A.invoice_date = '2019-09-05' and A.ship_from_dc_nbr = 6011
group by 
A.invoice_nbr
, A.invoice_date
, A.ship_from_dc_nbr
, A.ship_to_store_nbr
, A.trailer_id
, B.item_nbr
, C.old_nbr
, C.whpk_qty
, C.vnpk_qty
, C.item_type_code
, D.po_type

您可以根据需要将类似的逻辑调整到您的其他SUM()s。它仍然是一个普通的SUM,除非您根据invoice_date 选择何时在计算中包含行的值。

【讨论】:

这将全部在一列中还是在 3 个不同的列中?这里有点困惑 这将为每个 SUM() 返回一个单独的列。稍后查看更新的答案。 这个运气好吗?你能让它工作吗? 是的,非常感谢;抱歉回复晚了

以上是关于(Teradata) 获取前 12 个月、3 个月和 1 个月的 SUM 值的主要内容,如果未能解决你的问题,请参考以下文章

使用Scala从给定月份获取前12个月的月底日期

一JavaScript获取当前月份的前12个月,获取最近的12个月二js实现获取当前月份前的12个月份,格式化后放在一个数组里

如何在SHELL获取当天时间的月份和上个月的月份还有下个月的月份

前 3 个月的值总和

js如何获取前几个月或后几个月时间

获取最近 3 个月数据的 SQL 查询