2016-04-13 11 views
1

クレジットメモがある場合、支払いを除くすべての行の請求書アクティビティを取得しようとしています。請求書(I)、クレジットメモ(C)、支払い(P)、デビットメモ(D)など、さまざまなアクティビティを持つ共通の注文番号があります。注文書にクレジットメモがない場合、私はそれを記載したくありません。クレジットレコードがある場合、すべての請求書アクティビティを取得

私が探している結果セットがある:代わりに

Order_id record_type amount order_date invoice_no_string 
------------------------------------------------------------------- 
5023318 Invoice  3063.38 3/7/16  5023318 
5023318 Credit memo -3063.38 3/7/16  5023318 
5023318 Invoice  2723.00 3/7/16  5023318A 

、これを理解しようとする日後、私はこれを得るまでだ:

Order_id record_type amount order_date invoice_no_string 
------------------------------------------------------------------- 
5023318 Invoice  3063.38 3/7/16  5023318 
5023318 Credit memo -3063.38 3/7/16  5023318 
5023318 Credit memo -3063.38 3/7/16  5023318 
5023318 Invoice  2723.00 3/7/16  5023318A 

私は新しいですSQLのではなく、これが何であるかをデータベースタイプを確認してください...ここで

コードは任意のヘルプは高く評価され、..です

SELECT 
    file1.order_id order_id, 
    file1.invoice_no_string, 
    file1.bill_date, 
    convert(varchar(10),orders.ordered_date,101) order_date, 
    file1.customer_id cust_no, 
    customer.name cust_name, 
    file1.record_type type, 
    file1.amount amount, 
    file1.source 

FROM 
    open_item file1 
JOIN 
    open_item file2 
ON 
    file1.order_id = file2.order_id 

LEFT OUTER JOIN 
    customer on customer.id = file1.customer_id and 
    customer.company_id = 'TMS' 

LEFT OUTER JOIN 
    orders on orders.id = file1.order_id and 
    orders.company_id = 'TMS' 
WHERE 
    file1.company_id = 'TMS' and 
    orders.ordered_date >= {d '2016-03-01'} and 
    orders.ordered_date <= {d '2016-03-15'} and 
    file1.source ='B' and 
    file1.record_type = 'I' and 
    file2.record_type = 'C' or 
    file1.company_id = 'TMS' and 
    orders.ordered_date >= {d '2016-03-01'} and 
    orders.ordered_date <= {d '2016-03-15'} and 
    file1.source ='B' and 
    file1.record_type = 'C' 

ORDER BY 
    order_id 
+0

これはあなたの問題を解決することはできませんが、 'WHERE'節に右側のテーブルフィルタ(' orders')を含めることで、 'LEFT OUTER JOIN'を' INNER JOIN'に変換しています。それらは 'ON'節に移動する必要があります。 – Siyual

+0

クエリが実行される場合は、SQL Serverです。 –

答えて

0

あなたの質問は、あなたのやりたいことのために複雑すぎるようです。 FROM句のすべての異なるテーブルで、私があなたが探しているフィルタリングについて正確にはわかりません。

しかし、あなたはクレジットなしレコードを持つ顧客からのすべての不払いオープンアイテムをしたい場合は、あなたがこのようなクエリを使用することができます:簡素化は別に

SELECT . . . 
FROM open_item ot JOIN 
    customer c 
    ON c.id = ot.customer_id and 
     c.company_id = 'TMS' JOIN 
    orders o 
    ON o.id = ot.order_id 
WHERE o.ordered_date >= {d '2016-03-01'} AND 
     o.ordered_date <= {d '2016-03-15'} AND 
     ot.record_type <> 'P' AND 
     EXISTS (SELECT 1 
       FROM order_type ot2 
       WHERE ot2.customer_id = ot.customer_id AND 
        ot2.record_type = 'C' 
      ); 

を、キーアイデアはEXISTSを使用することです同じ顧客のクレジットレコードが存在することを確認することができます。

+0

おかげで、私は、関連するデータは基本的に.. ORDER_ID量RECORD_TYPE源 1 100 I(インボイス)B(課金) 1 -100 C(クレジット)B 1~80 IB 2 200 IB 2 -5 CC タイプCの場合は行を除外するための何かがありません。ソースはC –

+0

です。新しいコードを投稿できないように、私は500文字程度に制限されているようです –

関連する問題