1

各製品の在庫数に基づいて顧客に製品を割り当てる SQL クエリを作成しました。

つまり、OurQty = 55 で、5 人の顧客 (顧客 1 = 35、顧客 2 = 10、顧客 3 = 3、顧客 4 = 16、顧客 5 = 6) に分割された未処理の注文が 70 ある場合、SQL クエリは予約済みの製品を割り当てます。 OurQty = 0 またはすべての未処理の注文が履行されるまで、各顧客に順番に数量を送信します。

私のSQLクエリ:

WITH allocate 
     AS (SELECT rd.ponum                                  AS PONum, 
                od.orderline                              AS OrderLine, 
                rd.partnum                                AS PartNum, 
                p.partdescription                         AS PartDescription, 
                od.ordernum                               AS OrderNum, 
                rd.ourqty                                 AS OurQty, 
                od.number01                               AS Reserved, 
                rd.ourqty - od.number01                   AS NewOurQty, 
                c.custnum                                 AS CustNum, 
                c.name                                    AS Name, 
                ( rd.ourqty - Sum(od.number01) 
                                OVER ( 
                                  ORDER BY od.ordernum) ) AS CumulativeSum 
         FROM   dbo.rcvdtl AS rd WITH (nolock) 
                INNER JOIN dbo.part AS p WITH (nolock) 
                        ON rd.partnum = p.partnum 
                INNER JOIN dbo.orderdtl AS od WITH (nolock) 
                        ON rd.partnum = od.partnum 
                INNER JOIN dbo.orderhed AS oh WITH (nolock) 
                        ON od.ordernum = oh.ordernum 
                INNER JOIN dbo.customer AS c WITH (nolock) 
                        ON od.custnum = c.custnum 
         WHERE  ( rd.ponum = 73 ) 
                AND ( od.number01 > 0 ) 
                AND ( od.openline = 1 )) 
SELECT ponum, 
       orderline, 
       partnum, 
       partdescription, 
       ordernum, 
       ourqty, 
       reserved, 
       newourqty, 
       custnum, 
       name, 
       cumulativesum + reserved AS 'Left In Stock', 
       CASE 
         WHEN ( cumulativesum + reserved ) - reserved > 0 THEN reserved 
         ELSE ( CASE 
                  WHEN ( cumulativesum + reserved ) > 0 THEN 
                  ( cumulativesum + reserved ) 
                  ELSE 0 
                END ) 
       END                      AS Allocated 
FROM   allocate 

これは、'PartNum' がパラメーターとして指定されている場合に正常に機能します。テーブルには複数の「PartNums」が含まれているため、「PartNum」を指定せずにテーブルをクエリすると問題が発生します。これは、(OurQty < CumulativeSum) をチェックするために使用される「CumulativeSum」の精度に影響を与え、在庫の割り当てを防ぐためです。物理的に存在しないもの。

私の最初のアイデアは、データベース テーブルに特定の 'PONum' のパラメーターとして 'PartNum' を繰り返し渡し、その結果をアプリケーションの 1 つのデータセットにマージすることでした。残念ながら、私が使用している SQL クエリを呼び出すプログラムは、'PartNum' をパラメータとして SQL クエリに渡すことができません。

したがって、SQL を使用してテーブル内の各 PartNum の累積合計を計算することは可能ですか?

Microsoft SQL Server 2012 を使用しています

4

0 に答える 0