我被这个逻辑束缚了一段时间,终于向社区寻求帮助。我正在制作一个价格差异图表,使用以下逻辑:
上一年的总销量-如果过去12个月内该商品的销量为空,表示该商品从未售出,则为0
(过去12个月内该项目所有交易的平均价格-过去13-24个月内该项目所有交易的平均价格)x(本年总交易量)
我试着用高级sql查询出最近12个月和当前日期前13-24个月的平均价格,但是我不认为我的where语句会这样做:
SELECT
inv_item_mst.item,
AVG(inv_item_mst.price*(1-(inv_item_mst.disc/100))) AS [AvgPreviousPrice],
SUM(inv_item_mst.qty_invoiced) AS [PreviousVolume],
inv_hdr_mst.cust_num
FROM inv_item_mst
LEFT JOIN inv_hdr_mst
ON inv_item_mst.inv_num=inv_hdr_mst.inv_num
WHERE YEAR(inv_hdr_mst.inv_date) = YEAR(DATEADD(YEAR,-1,GETDATE()))
GROUP BY inv_item_mst.item,
inv_hdr_mst.cust_num
我使用where year(inv\u hdr\u mst.inv\u date)=year(dateadd(year,0,getdate()))复制了相同的代码,以获得当前的数量和当前的平均价格。
你知道我可以把where改成什么吗?这样就可以跟踪0-11个月(当前)和12-23个月(以前)范围内所有交易项目的平均价格和交易量?
注意:我还需要添加逻辑,说明如果该项在前12个月不存在,那么我需要它为0。我用一个主项表来连接这两个查询,以确保我得到他们试图跟踪的所有项,而不管是哪一年。
1条答案
按热度按时间nbewdwxp1#
因为您没有指定所需的输出格式,所以有多种解决方案。
此外,你的问题包含一些关于你如何计算“滚动”平均数的矛盾信息。与使用实际年份值相比,像[0-11]和[12,13]个月这样的日期范围将产生不同的结果。下面的例子证明了我的观点。
样本数据
定义表结构
确定样本数据的日期范围
插入一些示例数据
解决方案1
此解决方案并排(在同一行上)显示各个时段的值。这两个句点有两个外部apply子查询。当前期间和上一期间使用日期范围进行计算。
结果如下:
解决方案2
此解决方案显示彼此下面不同时段(不同行)的值。它使用用
with
关键字。你和我吵架了null
对于没有事务处理的项目(可以替换为isnull()
). 当前期间和上一期间将再次使用日期范围进行计算。这将以另一种格式给出相同的数字:
解决方案3
解决方案2的一个变体,但我现在使用的不是日期范围,而是实际年份。因此,这个版本要短得多(而且更简单)。
但与之前的数字相比,这会产生不同的结果!
希望这能解决你的问题。