重复行的SQL查询设置为NULL

时间:2017-11-23 10:21:22

标签: sql sql-server sql-server-2008

我有父母和儿童表...... 主表:SalesInvoice

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

对于ID'1',我有两次TotalQty'100',但如果重复,我想要设置为0。

2 个答案:

答案 0 :(得分:1)

下面的查询是基于以下假设构建的:如果重复值具有更高的ItemMasterID,则需要TotalQty 0,ID和ItemMasterID的总和数量(基于输出)。如果他们错了,请告诉我。查询包含示例数据,可以按原样运行:

-- 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

答案 1 :(得分: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