根据 table B 中的日期范围旋转字段 >= table A 中的日期范围
Pivoting a field based on date range in table B that is >= date range in table A
我正在尝试将一行转换为基于格式化日期的列 'yyyy-MMM',虽然这在当前月份按预期工作,但在未来几个月无法工作,我不知道如何解决这个问题,非常感谢对此的任何反馈。
这里有一些背景知识:
我从供应商摘要 table 购买了数量,其中包括有关合同的信息,例如合同类型、数量、批号、格式为 'yyyy-MMM' 的创建日期,因为实际日期对此并不重要。
剩余数量是来自项目分类帐条目的另一个字段table,它基本上是根据批号汇总各种条目。
消耗数量是我试图根据消耗的月份进行透视的数量,它也来自具有条目类型过滤器的项目分类帐条目
SELECT *
FROM
(
SELECT VS.[Vendor Name], VS.[Vendor No_] AS 'Vendor_No', VS.[Date] AS 'Date',
SUM(VS.Quantity) AS 'Contracted_Quantity',
SUM(CQ.Consumed_Qty*-1) AS 'Consumed_Qty',
SUM(RQ.Remaining_Qty) AS Remaining_Qty,
'Contract Type' =
CASE
WHEN VS.[Contract Type] = 1 THEN 'CONTRACT A'
WHEN VS.[Contract Type] = 2 THEN 'CONTRACT B'
ELSE 'OTHERS'
END
FROM
(SELECT [Document No_],[Vendor No_],[Lot No_],FORMAT([Date Created], 'yyyy-MMM') AS 'Date'
,[Purch_ Contract No_],[Contract Type],[Quantity] FROM [A].[dbo].[Company$Volume Summary]) VS
/*to identify remaining quantity by lot (Lot no. is included in my VS alias statement)*/
LEFT JOIN (SELECT [Lot No_] ,SUM([Remaining Quantity]) AS Remaining_Qty FROM [A].[dbo].[Company$Item Ledger Entry]
GROUP BY [Lot No_]) RQ on RQ.[Lot No_] = VS.[Lot No_]
/*to identify consumed volume, if consumption is in future month compared to purchase month, it doesn't populate, this is where I believe the problem is*/
LEFT JOIN (SELECT [Lot No_],FORMAT([Posting Date], 'yyyy-MMM') AS 'Date',SUM([Quantity]) AS Consumed_Qty
FROM [A].[dbo].[Company$Item Ledger Entry]
WHERE [Entry Type] = '5'
GROUP BY [Lot No_], Format([Posting Date], 'yyyy-MMM')) CQ on CQ.[Lot No_] = VS.[Lot No_] and CQ.Date >= VS.[Date]
GROUP BY VS.[Vendor Name], FORMAT(VS.[Date Created],'yyyy-MMM'), PT.[Contract Type], VS.[Vendor No_]
) cs
PIVOT
(
SUM(Consumed_Qty)
for Date in ([2021-Sep], [2021-Oct], [2021-Nov])
) pvt
结果(仅显示部分):
如您所见,第二条 ABC Technology 记录显示 2021 年 10 月的消耗量是准确的,但是,根据同样在 2021 年 10 月购买的合同金额以及该记录中的剩余量,消耗量与 2021 年 10 月准确显示的 8,990 相比,需要 9,373 且短 (383)。在这种情况下,383 的实际消耗量在 2021 年 11 月下降,但是,我的代码似乎没有发现这一点。
这也是 Zebra 技术记录中的确切情况,其中剩余为 0,这意味着它已被完全消耗,但是,因为它们的购买合同日期都在 2021 年 9 月,而消费是在未来的 2021 年 10 月,SQL 脚本没有选择它。
如果能提供任何帮助解决此问题的指导,我将不胜感激,在此先致谢。
您正在根据 VS.[Date] 进行旋转,这是购买批次的时间,而不是消费的时间。最后三列将仅显示在同一个月内购买和消费商品的数字。
不是对整个数据集进行透视,而是将透视移动到第三个子查询中。这简化了查询,首先获取包括 Contracted_Qty 和 Remaining_Qty 在内的 Lot 详细信息,然后加入第三个子查询,该子查询是按 Lot 按三个月计算的 Consumed_Qty 的枢轴集。
SELECT VS.[Vendor Name], VS.[Vendor No_] AS 'Vendor_No',
VS.[Contracted_Quantity],
RQ.Remaining_Qty AS Remaining_Quantity,
'Contract Type' =
CASE
WHEN VS.[Contract Type] = 1 THEN 'CONTRACT A'
WHEN VS.[Contract Type] = 2 THEN 'CONTRACT B'
ELSE 'OTHERS'
END,
CQ.[2021-Sep], CQ.[2021-Oct], CQ.[2021-Nov]
FROM
(
/* List of Lots with details */
SELECT
[Document No_],[Vendor No_],[Lot No_], [Purch_ Contract No_],[Contract Type],[Quantity] AS [Contracted_Quantity]
FROM [A].[dbo].[Company$Volume Summary]
) VS
/* Remaining Quantity for each Lot */
LEFT JOIN (
SELECT [Lot No_] , SUM([Remaining Quantity]) AS Remaining_Quantity
FROM [A].[dbo].[Company$Item Ledger Entry]
GROUP BY [Lot No_]
) RQ on RQ.[Lot No_] = VS.[Lot No_]
/* Consumed Quantity per Lot for three months*/
LEFT JOIN (
SELECT [Lot No_], [2021-Sep], [2021-Oct], [2021-Nov]
FROM
(
SELECT [Lot No_], FORMAT([Posting Date], 'yyyy-MMM') AS 'Date', SUM([Quantity]) AS Consumed_Qty
FROM [A].[dbo].[Company$Item Ledger Entry]
WHERE [Entry Type] = '5'
GROUP BY [Lot No_], Format([Posting Date], 'yyyy-MMM')
) AS src
PIVOT
(
SUM(Consumed_Qty)
for [Date] in ([2021-Sep], [2021-Oct], [2021-Nov])
) pvt
) CQ on CQ.[Lot No_] = VS.[Lot No_]
;
没有数据我无法测试这个查询,但它应该非常接近。
我正在尝试将一行转换为基于格式化日期的列 'yyyy-MMM',虽然这在当前月份按预期工作,但在未来几个月无法工作,我不知道如何解决这个问题,非常感谢对此的任何反馈。
这里有一些背景知识: 我从供应商摘要 table 购买了数量,其中包括有关合同的信息,例如合同类型、数量、批号、格式为 'yyyy-MMM' 的创建日期,因为实际日期对此并不重要。
剩余数量是来自项目分类帐条目的另一个字段table,它基本上是根据批号汇总各种条目。
消耗数量是我试图根据消耗的月份进行透视的数量,它也来自具有条目类型过滤器的项目分类帐条目
SELECT *
FROM
(
SELECT VS.[Vendor Name], VS.[Vendor No_] AS 'Vendor_No', VS.[Date] AS 'Date',
SUM(VS.Quantity) AS 'Contracted_Quantity',
SUM(CQ.Consumed_Qty*-1) AS 'Consumed_Qty',
SUM(RQ.Remaining_Qty) AS Remaining_Qty,
'Contract Type' =
CASE
WHEN VS.[Contract Type] = 1 THEN 'CONTRACT A'
WHEN VS.[Contract Type] = 2 THEN 'CONTRACT B'
ELSE 'OTHERS'
END
FROM
(SELECT [Document No_],[Vendor No_],[Lot No_],FORMAT([Date Created], 'yyyy-MMM') AS 'Date'
,[Purch_ Contract No_],[Contract Type],[Quantity] FROM [A].[dbo].[Company$Volume Summary]) VS
/*to identify remaining quantity by lot (Lot no. is included in my VS alias statement)*/
LEFT JOIN (SELECT [Lot No_] ,SUM([Remaining Quantity]) AS Remaining_Qty FROM [A].[dbo].[Company$Item Ledger Entry]
GROUP BY [Lot No_]) RQ on RQ.[Lot No_] = VS.[Lot No_]
/*to identify consumed volume, if consumption is in future month compared to purchase month, it doesn't populate, this is where I believe the problem is*/
LEFT JOIN (SELECT [Lot No_],FORMAT([Posting Date], 'yyyy-MMM') AS 'Date',SUM([Quantity]) AS Consumed_Qty
FROM [A].[dbo].[Company$Item Ledger Entry]
WHERE [Entry Type] = '5'
GROUP BY [Lot No_], Format([Posting Date], 'yyyy-MMM')) CQ on CQ.[Lot No_] = VS.[Lot No_] and CQ.Date >= VS.[Date]
GROUP BY VS.[Vendor Name], FORMAT(VS.[Date Created],'yyyy-MMM'), PT.[Contract Type], VS.[Vendor No_]
) cs
PIVOT
(
SUM(Consumed_Qty)
for Date in ([2021-Sep], [2021-Oct], [2021-Nov])
) pvt
结果(仅显示部分):
如您所见,第二条 ABC Technology 记录显示 2021 年 10 月的消耗量是准确的,但是,根据同样在 2021 年 10 月购买的合同金额以及该记录中的剩余量,消耗量与 2021 年 10 月准确显示的 8,990 相比,需要 9,373 且短 (383)。在这种情况下,383 的实际消耗量在 2021 年 11 月下降,但是,我的代码似乎没有发现这一点。
这也是 Zebra 技术记录中的确切情况,其中剩余为 0,这意味着它已被完全消耗,但是,因为它们的购买合同日期都在 2021 年 9 月,而消费是在未来的 2021 年 10 月,SQL 脚本没有选择它。
如果能提供任何帮助解决此问题的指导,我将不胜感激,在此先致谢。
您正在根据 VS.[Date] 进行旋转,这是购买批次的时间,而不是消费的时间。最后三列将仅显示在同一个月内购买和消费商品的数字。
不是对整个数据集进行透视,而是将透视移动到第三个子查询中。这简化了查询,首先获取包括 Contracted_Qty 和 Remaining_Qty 在内的 Lot 详细信息,然后加入第三个子查询,该子查询是按 Lot 按三个月计算的 Consumed_Qty 的枢轴集。
SELECT VS.[Vendor Name], VS.[Vendor No_] AS 'Vendor_No',
VS.[Contracted_Quantity],
RQ.Remaining_Qty AS Remaining_Quantity,
'Contract Type' =
CASE
WHEN VS.[Contract Type] = 1 THEN 'CONTRACT A'
WHEN VS.[Contract Type] = 2 THEN 'CONTRACT B'
ELSE 'OTHERS'
END,
CQ.[2021-Sep], CQ.[2021-Oct], CQ.[2021-Nov]
FROM
(
/* List of Lots with details */
SELECT
[Document No_],[Vendor No_],[Lot No_], [Purch_ Contract No_],[Contract Type],[Quantity] AS [Contracted_Quantity]
FROM [A].[dbo].[Company$Volume Summary]
) VS
/* Remaining Quantity for each Lot */
LEFT JOIN (
SELECT [Lot No_] , SUM([Remaining Quantity]) AS Remaining_Quantity
FROM [A].[dbo].[Company$Item Ledger Entry]
GROUP BY [Lot No_]
) RQ on RQ.[Lot No_] = VS.[Lot No_]
/* Consumed Quantity per Lot for three months*/
LEFT JOIN (
SELECT [Lot No_], [2021-Sep], [2021-Oct], [2021-Nov]
FROM
(
SELECT [Lot No_], FORMAT([Posting Date], 'yyyy-MMM') AS 'Date', SUM([Quantity]) AS Consumed_Qty
FROM [A].[dbo].[Company$Item Ledger Entry]
WHERE [Entry Type] = '5'
GROUP BY [Lot No_], Format([Posting Date], 'yyyy-MMM')
) AS src
PIVOT
(
SUM(Consumed_Qty)
for [Date] in ([2021-Sep], [2021-Oct], [2021-Nov])
) pvt
) CQ on CQ.[Lot No_] = VS.[Lot No_]
;
没有数据我无法测试这个查询,但它应该非常接近。