2017-11-23 5 views
0

のために、私は親だけでなく、子テーブル... マスターテーブルを持っている:SalesInvoiceSQLクエリを繰り返し行セットのNULL

ID ToatlQty Unit 
1   100 BOX 
2   110 BOX 

ディテール表:SalesInvoiceDetail

DetailsID ID ItemMasterID Qty Unit 
     01  1 000000001010 25 BOX 
     02  1 000000001010 25 BOX 
     03  1 000000001013 30 BOX 
     04  2 000000001014 50 BOX 

は私が

のような出力をしたいです
ID ItemMasterID Unit TotalQty Qty 
1 000000001010 BOX   100 50 
1 000000001013 BOX   0 30 
2 000000001014 BOX   110 50 

私はTotalQty '100'をID '1'のために2回持っていますが、それがリピートする場合は0に設定しますd。

+4

私達にあなたの現在のクエリの試みを表示します。 – jarlh

+0

これは比較的簡単なクエリのようですが、両方のテーブルのIDにJOINを使用し、次にGROUP BYにSUMのQtyを使用する必要があります。 – Gimly

+1

ヒント: 'SUM'、' group by'および 'coalesce' – zarruq

答えて

1

以下のクエリは、ItemMasterIDが高く、IDでQty、(出力に基づいて)ItemMasterIDがある場合、繰り返し値にはTotalQty 0が必要です。彼らが間違っているかどうか私に教えてください。クエリは、サンプルデータが含まれており、あるとして実行することができます:

-- sample data 
;with SalesInvoice as (
    select * from (values 
     (1, 100, 'BOX'), 
     (2, 110, 'BOX') 
    ) t(ID, TotalQty, Unit) 
), 
SalesInvoiceDetail as (
    select * from (values 
     (1, 1, '000000001010', 25, 'BOX'), 
     (2, 1, '000000001010', 25, 'BOX'), 
     (3, 1, '000000001013', 30, 'BOX'), 
     (4, 2, '000000001014', 50, 'BOX') 
    ) t (DetailsID, ID, ItemMasterID, Qty, Unit)  
) 

-- solution 
select 
    t.ID, 
    t.ItemMasterID, 
    SalesInvoice.Unit, 
    TotalQty = 
     case when ROW_NUMBER() over(partition by t.id order by ItemMasterID) = 1 
     then TotalQty else 0 end, 
    t.Qty 
from (
    select id, ItemMasterID, Qty = sum(qty) from SalesInvoiceDetail 
    group by id, ItemMasterID 
) t 
join SalesInvoice on t.id = SalesInvoice.ID 
+0

サブクエリーを使用する必要はありません。あなたは 'join'、' group by'、 'row_number()'を一つのステップで使うことができます。... +1 :-) – zarruq

0
SELECT A.Id , 
     A.ItemMasterID , 
     A.Unit , 
     ISNULL(B.ToatlQty, 0) AS ToatlQty , 
     A.Qty 
FROM  (SELECT Id , 
        ItemMasterID , 
        Unit , 
        SUM(Qty) AS Qty 
      FROM  SalesInvoiceDetail A 
      GROUP BY Id , 
        ItemMasterID , 
        Unit 
     ) A 
     LEFT JOIN SalesInvoice B ON A.ID = B.ID 
関連する問題