2017-03-08 8 views
1

私のMS SQL Serverのクエリがあります。このクエリは、在庫にあるすべての製品の数量を計算し、各店舗の購入および販売のために待機します。ユニオンを使用して4つの異なるテーブルから最新の日付を取得する

SELECT i.no_, 
     s2.location, 
     s2.bincode, 
     s2.inventory, 
     s2.purchase, 
     s2.sale, 
     s2.defbinflag 
FROM dbo.[kasia$item] AS i WITH (nolock) 
     LEFT OUTER JOIN (SELECT s.itemno, 
           s.location, 
           bc.bincode, 
           Sum(s.inventory) AS Inventory, 
           Sum(s.purchase) AS Purchase, 
           Sum(s.sale)  AS Sale, 
           bc.defbinflag 
         FROM (SELECT [item no_]  AS ItemNo, 
             [location code] AS Location, 
             Sum(quantity) AS Inventory, 
             0    AS purchase, 
             0    AS sale, 
             [bin code]  AS BinCode 
           FROM dbo.[kasia$warehouse entry] WITH 
             (nolock 
             ) 
           WHERE (quantity <> 0) 
           GROUP BY [item no_], 
              [location code], 
              [bin code] 
           UNION ALL 
           SELECT no_       AS ItemNo, 
             [location code]    AS Location, 
             0        AS Inventory, 
             Sum([outstanding qty_ (base)]) AS purchase, 
             0        AS sale, 
             [bin code]      AS BinCode 
           FROM dbo.[kasia$purchase line] WITH ( 
             nolock) 
           WHERE ([document type] = 1) 
             AND (type = 2) 
           GROUP BY no_, 
              [location code], 
              [bin code] 
           UNION ALL 
           SELECT no_       AS ItemNo, 
             [location code]    AS Location, 
             0        AS Inventory, 
             0        AS purchase, 
             Sum([outstanding qty_ (base)]) AS sale, 
             [bin code]      AS BinCode 
           FROM dbo.[kasia$sales line] WITH ( 
             nolock) 
           WHERE ([document type] = 1) 
             AND (type = 2) 
           GROUP BY no_, 
              [location code], 
              [bin code] 
           UNION ALL 
           SELECT [item no_]      AS ItemNo, 
             [transfer-from code]   AS Location, 
             0        AS Inventory, 
             0        AS purchase, 
             Sum([outstanding qty_ (base)]) AS sale, 
             [transfer-from bin code]  AS BinCode 
           FROM dbo.[kasia$transfer line] WITH ( 
             nolock) 
           GROUP BY [item no_], 
              [transfer-from code], 
              [transfer-from bin code]) AS s 
           LEFT OUTER JOIN 
           (SELECT DISTINCT 
           [item no_], 
           [location code], 
           [bin code] AS BinCode, 
           [default] AS DefBinFlag 
           FROM dbo.[kasia$bin content] 
             WITH (nolock) 
           GROUP BY [item no_], 
              [location code], 
              [bin code], 
              [default]) AS bc 
              ON s.itemno = bc.[item no_] 
               AND bc.[location code] = 
                s.location 
               AND bc.bincode = s.bincode 
         WHERE (bc.bincode IS NOT NULL) 
         GROUP BY s.itemno, 
            s.location, 
            bc.bincode, 
            bc.defbinflag) AS s2 
        ON s2.itemno = i.no_ 

しかし、私は4つのテーブルの一つに最新のエントリの日付を追加する必要がある必要がある

[kasia$warehouse entry] 
[kasia$purchase line] 
[kasia$sales line] 
[kasia$transfer line] 

私は最後のエントリを含む日時変数で最終セットで列を得ることができる方法4つのテーブルから?私は私はそれが読めなくなるだろう日付を取得しようとしていると正常に動作し、このクエリを肉屋しようとしていないが、次のように列は以下のとおりです。今のところ

[kasia$warehouse entry] [Expected Receipt Date] 
[kasia$purchase line] [Shipment Date] 
[kasia$sales line] [Shipment Date] 
[kasia$transfer line] [Registering Date] 

iは、結果として、例えば、これを持っている:

+---------+----------+---------+-----------+----------+------+------------+ 
| No_  | location | bincode | inventory | purchase | sale | defbinflag | 
+---------+----------+---------+-----------+----------+------+------------+ 
| 0035513 | dp  | V14-3 | 3   | 2  | 1 | 1   | 
+---------+----------+---------+-----------+----------+------+------------+ 

日付を含む列を追加する必要があります。

+1

私が知る限り、これらのテーブルから*日付を返すわけではありません。私はその質問を理解していない。 –

+0

はい!投稿を編集します。 – HellOfACode

+0

解決策ではなく、むしろ提案です。私はクエリを簡単に見直すために、いくつかのCTEに分解します。それを見ると、めまいがする。これを行うと、 'ROW_NUMBER'や' DENSE_RANK'のようなウィンドウ関数を使って順序を決定することもできます。 – pimbrouwers

答えて

1

各ユニオンのすべてのクエリとそれを上回るクエリと最上位のクエリに合計を加えます。同様に:

select 
    i.no_ 
    , s2.location 
    , s2.bincode 
    , s2.inventory 
    , s2.purchase 
    , s2.sale 
    , s2.defbinflag 
    , s2.maxDate 
from dbo.[kasia$item] as i with (nolock) 
    left join (
    select 
     s.itemno 
     , s.location 
     , bc.bincode 
     , Sum(s.inventory) as Inventory 
     , Sum(s.purchase) as Purchase 
     , Sum(s.sale) as Sale 
     , bc.defbinflag 
     , max(s.MaxDate) as maxDate 
    from (
     select 
      [item no_] as ItemNo 
     , [location code] as Location 
     , Sum(quantity) as Inventory 
     , 0 as purchase 
     , 0 as sale 
     , [bin code] as BinCode 
     , max([Expected Receipt Date]) as MaxDate 
     from dbo.[kasia$warehouse entry] with (nolock) 
     where (quantity <> 0) 
     group by 
      [item no_] 
     , [location code] 
     , [bin code] 

     union all 
     select 
      no_ as ItemNo 
     , [location code] as Location 
     , 0 as Inventory 
     , Sum([outstanding qty_ (base)]) as purchase 
     , 0 as sale 
     , [bin code] as BinCode 
     , max([Shipment Date]) as MaxDate 
     from dbo.[kasia$purchase line] with (nolock) 
     where ([document type] = 1) 
     and (type = 2) 
     group by 
     no_ 
     , [location code] 
     , [bin code] 

     union all 
     select 
      no_ as ItemNo 
     , [location code] as Location 
     , 0 as Inventory 
     , 0 as purchase 
     , Sum([outstanding qty_ (base)]) as sale 
     , [bin code] as BinCode 
     , max([Shipment Date]) as MaxDate 
     from dbo.[kasia$sales line] with (nolock) 
     where ([document type] = 1) 
     and (type = 2) 
     group by 
     no_ 
     , [location code] 
     , [bin code] 

     union all 
     select 
     [item no_] as ItemNo 
     , [transfer-from code] as Location 
     , 0 as Inventory 
     , 0 as purchase 
     , Sum([outstanding qty_ (base)]) as sale 
     , [transfer-from bin code] as BinCode 
     , max([Registering Date]) as MaxDate 
     from dbo.[kasia$transfer line] with (nolock) 
     group by [item no_] 
     , [transfer-from code] 
     , [transfer-from bin code] 
    ) as s 
    left join (
    select distinct 
     [item no_] 
     , [location code] 
     , [bin code] as BinCode 
     , [default] as DefBinFlag 
    from dbo.[kasia$bin content] with (nolock) 
    group by [item no_] 
     , [location code] 
     , [bin code] 
     , [default] 
    ) as bc 
     on s.itemno = bc.[item no_] 
    and bc.[location code] = s.location 
    and bc.bincode = s.bincode 
    where (bc.bincode is not null) 
    group by s.itemno 
    , s.location 
    , bc.bincode 
    , bc.defbinflag 
    ) as s2 
    on s2.itemno = i.no_ 
0

同じテーブルの最大日付とキーを結合して最新のスナップショットを取得すると、同じ問題が発生しました。ここでは1つの例が追加され、すべてのテーブルで同じことが使用できます。

FROM dbo.[kasia$warehouse entry] warehouse 
    JOIN (select itemno, location, bincode, max(ReceiptDate) lastdate from 
      dbo.[kasia$warehouse entry] 
      Group by itemno, location, bincode 
     ) lastreceiptwarehouse 
     on lastreceiptwarehouse.itemno = warehouse.itemno 
     and lastreceiptwarehouse.location = warehouse.location 
     and lastreceiptwarehouse.bincode = warehouse.bincode 
      and lastreceiptwarehouse.lastdate= warehouse.ReceiptDate 
関連する問題