Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 对采购订单未涵盖的现货需求的查询_Sql Server_Sql Server 2014 - Fatal编程技术网

Sql server 对采购订单未涵盖的现货需求的查询

Sql server 对采购订单未涵盖的现货需求的查询,sql-server,sql-server-2014,Sql Server,Sql Server 2014,我在SQL Server 2014中有两个表 第一个表是原材料的累积需求: create table #Demand ( ItemPN nvarchar(17), /* Part Number, for example "AA-ECN0018" */ [Period] nvarchar(7), /* Period in format YYYY-MM, for example "2020-01" */ Qty int /* Actual demand */ ) 第二个

我在SQL Server 2014中有两个表

第一个表是原材料的累积需求:

create table #Demand
(
    ItemPN nvarchar(17), /* Part Number, for example "AA-ECN0018" */
    [Period] nvarchar(7), /* Period in format YYYY-MM, for example "2020-01" */
    Qty int  /*  Actual demand */
)
第二个表是采购订单列表:

create table #PurchaseOrders
(
    OrderNumber int, /* P/O number */
    POLine int, /* P/O line number */
    ItemPN nvarchar(17), /* Part Number, for example "AA-ECN0018" */
    CurrentDelDate nvarchar(10), /* Delivery date in format YYYY-MM-DD, for example "2020-01-18" */
    OrderedQty int. /*Qty that has been ordered initially in the Purchase Order line */
    DeliveredQty int, /* Qty in the Purchase Order line that has been already delivered */
    BackOrderQty /* Qty that the supplier has to supply, actually it is OrderedQty - DeliveredQty */
)
我需要找出一个时期(YYYY-MM)范围内现有采购订单行未涵盖的零件号。因此,采购部需要加快这些P/N的采购订单

我计算了每个时期的累计需求:

SUM([Qty]) OVER(PARTITION BY Item ORDER BY Item, [Period] ROWS UNBOUNDED PRECEDING) AS DemandPerPeriod
然后我在p/N和Period上的
#Demand
#PurchaseOrders
表之间做了一个左连接:

SELECT 
  d.ItemPN DemandItem
 ,d.[Period] DemandPeriod
 ,t.[OrderNumber] 
 ,t.[POLine]
 ,t.ItemPN
 ,[OrderedQty] - [DeliveredQty] as ActualBackorder
 ,d.DemandPerPeriod
 ,SUM([OrderedQty] - [DeliveredQty]) OVER(PARTITION BY ItemPN ORDER BY ItemPN, CurrentDelDate ROWS UNBOUNDED PRECEDING)  RunningPur
  ,d.DemandPerPeriod -
  SUM([OrderedQty] - [DeliveredQty]) OVER(PARTITION BY ItemPN ORDER BY ItemPN, CurrentDelDate ROWS UNBOUNDED PRECEDING)
  AS NotCoveredDemand
t.CurrentDelDate 
FROM #PurchaseOrders t
  LEFT JOIN (
   SELECT 
    ItemPN
    ,[Period]
    ,QTY
    ,SUM([Qty]) OVER(PARTITION BY Item ORDER BY Item, [Period] ROWS UNBOUNDED PRECEDING)  DemandPerPeriod
  FROM #Demand ) d ON d.ItemPN = t.ItemPN 
            AND d.Period = CONVERT(NVARCHAR(4), YEAR(CurrentDelDate)) + '-' + RIGHT('00' + CONVERT(NVARCHAR(2),  Month(CurrentDelDate)), 2)
  WHERE ROUND(BackorderQty, 0) > 0
  ORDER BY ItemPN, Period
我真正需要的是:

  • 确保我的方法是正确的
  • 找出该月最后一笔未覆盖该月需求的订单

  • 可能是这样的:

    WITH Demands
    AS
    (
        SELECT d.ItemPN, [Period], SUM(Qty) AS TotalDemand
        FROM #Demand AS d
        GROUP BY d.ItemPN, [Period] 
    ),
    ExistingOrders
    AS
    (
        SELECT po.ItemPN, LEFT(po.CurrentDelDate, 7) AS [Period],
               SUM(po.OrderedQty - po.DeliveredQty) AS TotalBackorders
        FROM #PurchaseOrders AS po
        ON d.ItemPN = po.ItemPN 
        AND d.[Period] = LEFT(po.CurrentDelDate, 7)
        GROUP BY po.ItemPN, LEFT(po.CurrentDelDate, 7)
    ),
    UndersuppliedDemand
    AS
    (
        SELECT d.ItemPN, 
               d.[Period],
               d.TotalDemand - COALESCE(eo.TotalBackorders) AS TotalUndersupplied
        FROM Demands AS d
        LEFT OUTER JOIN ExistingOrders AS eo
        ON d.ItemPN = eo.ItemPN
        AND d.[Period] = eo.[Period]
        WHERE d.TotalDemand > eo.TotalBackorders
    )
    SELECT ud.ItemPN,
           ud.[Period],
           o.OrderNumber,
           o.POLine
    FROM UndersuppliedDemand AS ud
    CROSS APPLY 
    (
        SELECT po.OrderNumber,
               po.POLine
        FROM #PurchaseOrders AS po
        WHERE po.ItemPN = ud.ItemPN
        AND LEFT(po.CurrentDelDate, 7) = ud.[Period]
        AND po.OrderNumber = (SELECT MAX(pom.OrderNumber) 
                              FROM #PurchaseOrders AS pom
                              WHERE pom.ItemPN = ud.ItemPN
                              AND LEFT(pom.CurrentDelDate, 7) = ud.[Period])
    ) AS o;
    

    (没有数据等无法检查)

    谢谢。在
    现有订单中
    我应该
    左外连接
    #PurchaseOrders
    #Demand
    吗?我不是那样做的。我首先得到了需求,然后得到了任何现有的订单,然后用这两种方法来确定供应不足的需求。