首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于表B中的日期范围透视字段,该日期范围是表A中的>=日期范围

基于表B中的日期范围透视字段,该日期范围是表A中的>=日期范围
EN

Stack Overflow用户
提问于 2021-11-22 22:40:04
回答 1查看 48关注 0票数 0

我正在尝试将行转换为基于格式化日期'yyyy-MMM‘的列,虽然这在当前月份期间可以按预期工作,但它在未来几个月无法工作,我不知道如何解决这个问题,并非常感谢任何有关这方面的反馈。

这里有一点背景:我从供应商汇总表中购买了数量,该表包括合同类型、数量、批号、创建日期等合同信息,格式为'yyyy-MMM‘,因为实际日期对此并不重要。

剩余数量是来自项目分类帐条目表的另一个字段,该表本质上是根据批号汇总所有类型的条目。

消耗量是我试图根据消耗的月份进行透视的数量,它也来自具有条目类型筛选器的项目分类帐条目

代码语言:javascript
复制
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月购买的合同金额以及该记录中的剩余部分,消耗量需要为9,373,与2021-10月准确显示的8,990相比,消耗量较短(383)。在这种情况下,383的实际消耗在2021年11月下降,然而,我的代码似乎没有恢复到这一点。

在两个Zebra technologies记录中也是如此,剩余的值是0,这意味着它已经完全消耗了,但是,因为它们的购买合同日期都是2021-9月,而消耗是在未来的2021-10月,所以SQL脚本不会拾取它。

我非常感谢任何帮助解决这个问题的指导,并在此之前表示感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-23 02:04:23

您基于购买批次时的VS.Date进行透视,而不是根据消耗时进行透视。最后三列将仅显示当月购买和消费商品时的数字。

将透视移到第三个子查询中,而不是透视整个数据集。这简化了查询,首先获取批次详细信息,包括Contracted_Qty和Remaining_Qty,然后连接到第三个子查询,这是按批次划分的Consumed_Qty按三个月旋转的集合。

代码语言:javascript
复制
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_]
;

我不能在没有数据的情况下测试这个查询,但它应该非常接近。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70073240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档