【发布时间】:2017-02-28 03:23:28
【问题描述】:
这似乎是一个重复的问题,但这并不是因为论坛中的其他解决方案在这种情况下不起作用。
这是对我们的 ERP 数据库的查询,它试图获取零件的最终销售总成本。基本上,ERP 可以轻松计算出所有直接成本,但不计算报废成本。
我被卡住的地方是在 FROM 部分的子查询中标记:
>>>>>>HELP NEEDED STARTING HERE
现在编写的子查询将所有货物提取给我们的废品供应商并获得每磅的月平均费率,然后根据合金类型、月份和年份加入其他表。
我的财务部门告诉我,平均价格不是一个好的解决方案,因为一些金属价格波动太大,或者他们没有在零件发货的同一个月出售废金属,所以这行不通。
我需要从零件从我们工厂发货之前的最近日期获得我们为废金属支付的费率。
我在 Stack Overflow 上找到了其他示例,这些示例显示了执行此操作的方法,但主表和子查询表重叠,因此我看到的其他解决方案都失败了。我在下面的代码中进行了注释以显示和解释这一点。
我完全可以接受我处理这个错误的想法。我怎样才能做到这一点?
DECLARE @Date_From AS DATETIME;
DECLARE @Date_To AS DATETIME;
SET @Date_From = '2016-10-01 00:00:00.000';
SET @Date_To = GETDATE() ;
-- Start Main query
SELECT TOP 10
CCustomer.Customer_Type AS 'Industry'
,SShipper.Ship_Date AS 'Ship_Date'
,SSContainer.Serial_No AS 'Serial_No'
,PPart.Grade AS 'Alloy'
,tbl_ScrapValue.Scrap_Value_per_lb AS 'Scap_Value_per_lb'
FROM
Sales_v_Shipper_Line AS SSLine
JOIN Sales_v_Shipper AS SShipper
ON SShipper.Shipper_Key = SSLine.Shipper_Key
JOIN Part_v_Part AS PPart
ON SSLine.Part_Key = PPart.Part_Key
JOIN Common_v_Customer AS CCustomer
ON SShipper.Customer_No = CCustomer.Customer_No
-- >>>>>>HELP NEEDED STARTING HERE
-- Below is the sub query that pulls the scrap sales value per pound.
-- The key point is that both shipments to our customers of real parts,
-- and the 'shipments' of scrap metal sales come from the same tables,
-- mainly Part_v_Part and Sales_v_Shipper, because of that the other
--solutions for the 'join by closest date' in the forums don't work.
LEFT OUTER JOIN (SELECT
MONTH(SShipper.Ship_Date) AS 'Scrap_Ship_Month'
,YEAR(SShipper.SHip_Date) AS 'Scrap_Ship_Year'
,PPart.Grade AS 'Alloy'
,AVG(AARIDist.Unit_Price) AS 'Scrap_Value_per_lb'
FROM
Sales_v_Shipper AS SShipper
JOIN Sales_v_Shipper_Line AS SS_Line
ON SShipper.Shipper_Key = SS_Line.Shipper_Key
JOIN Part_v_Part AS PPart
ON SS_Line.Part_Key = PPart.Part_Key
JOIN Common_v_Customer AS CCustomer
ON SShipper.Customer_No = CCustomer.Customer_No
WHERE CCustomer.Customer_Code = 'Scrap_Vendor'
AND SSHipper.Ship_Date <= @Date_To
GROUP BY
MONTH(SShipper.Ship_Date)
,YEAR(SShipper.SHip_Date)
,PPart.Grade
) AS tbl_ScrapValue
ON PPart.Grade = tbl_ScrapValue.Alloy
AND
YEAR(SShipper.Ship_Date) = YEAR(tbl_ScrapValue.Scrap_Ship_Year)
AND
MONTH(SShipper.Ship_Date) =(tbl_ScrapValue.Scrap_Ship_Month)
--- >>>>HELP NEEDED ENDS HERE
WHERE
AND SShipper.Ship_Date >= @Date_From
AND SSHipper.Ship_Date <= @Date_To
GROUP BY
SShipper.Shipper_No
,SShipper.Ship_Date
,CCustomer.Customer_Type
,SSContainer.Quantity
,PPart.Grade
这是上面查询的示例输出,您可以看到“Scrap_Value_per_lb”失败:
[![Sample_Output][1]][1]
Industry Ship_Date Serial_No Alloy Scap_Value_per_lb
Material Processing 17-Oct-16 4:47:00 PM S472091 C182 NULL
Material Processing 17-Oct-16 4:47:00 PM S472210 C182 NULL
Material Processing 17-Oct-16 4:47:00 PM S472211 C182 NULL
Electronics 17-Oct-16 4:27:00 PM S436738 C180 NULL
Electronics 17-Oct-16 4:27:00 PM S463290 C180 NULL
Electronics 17-Oct-16 4:27:00 PM S463315 C180 NULL
Electronics 17-Oct-16 4:27:00 PM S463327 C180 NULL
Electronics 17-Oct-16 4:27:00 PM S463333 C180 NULL
Electronics 17-Oct-16 4:27:00 PM S463345 C180 NULL
Electronics 17-Oct-16 4:27:00 PM S463354 C180 NULL
更新
这是在 2016 年 10 月 19 日上午 7 点进行了第二次编辑,以进一步简化代码,在代码中添加了 cmets 以根据其他人的反馈进行澄清。
【问题讨论】:
-
这是您能想出的最短的问题示例?不要只是在这里转储你的代码,做一个简短的例子。
-
@JamesZ,这是一个简短的例子,我花了大约 30 分钟剪掉了很多。我想总会有更多的削减,但这大约是我开始时的 25%。我会根据您的反馈进行一些修改,但我想强调这不是我的代码的直接转储。
-
您使用的是什么版本的 SQL Server?
-
不幸的是,至少我无法弄清楚这里的问题是什么,有太多的表和连接,很难弄清楚。也许你需要使用外部应用而不是加入,选择顶部 1 + 有按日期顺序排列的顺序吗?
-
@FeryalBadili,T-SQL,感谢您的参与!
标签: sql-server tsql left-join inner-join closest