STOREID , GOODSID , SQT , IQT , OQT, CQT , NGOODSID , DD1, DD2
1001      3001      100   30  , 40 ,  80 , 8001 ,DDA , DDB
1001      3001      100   30  , 40 ,  80 , 8003 ,DDB , DDC
1001      3001      100   30  , 40 ,  80 , 8005 ,DDK , DDB1001      3002      100   30  , 40 ,  80 , 8005 ,DDK , DDB1001      3008      100   30  , 40 ,  80 , 8007 ,DDB , DDC
1001      3008      100   30  , 40 ,  80 , 8008 ,DDK , DDB把前面的字段 STOREID, GOODSID , SQT, IQT, OQT, CQT 均相同时只保留一行,同时SQT,IQT,OQT,CQT 设置为0
要求结果如下:
STOREID, GOODSID , SQT, IQT, OQT, CQT, NGID ,DD1,  DD2
1001      3001     100  30,  40,  80 , 8001 ,DDA , DDB
1001      3001     0    0 ,  0 ,  0,   8003 ,DDB , DDC
1001      3001     0    0 ,  0 ,  0    8005 ,DDK , DDB1001      3002    100  30 , 40 ,  80 , 8005 ,DDK , DDB1001      3008      100   30  , 40 ,  80 , 8007 ,DDB , DDC
1001      3008      0      0  , 0 ,   0 ,  8008 ,DDK , DDB
 

解决方案 »

  1.   

    SELECT * FROM TB T 
    WHERE NOT EXISTS
    (SELECT 1 FROM TB WHERE T.STOREID=STOREID AND T.GOODSID=GOODSID AND T.SQT=SQT  AND 
     IQT=T.IQT AND  OQT=T.OQT AND T.CQT=CQT AND NGOODSID <T.NGOODSID )UNION ALLSELECT STOREID , GOODSID , 0, 0, 0, 0, NGOODSID , DD1, DD2 
    FROM TB T 
    WHERE EXISTS
    (SELECT 1 FROM TB WHERE T.STOREID=STOREID AND T.GOODSID=GOODSID AND T.SQT=SQT  AND 
     IQT=T.IQT AND  OQT=T.OQT AND T.CQT=CQT AND NGOODSID <T.NGOODSID )
      

  2.   


    --> 测试数据:[TB]
    if object_id('[TB]') is not null drop table [TB]
    create table [TB]([STOREID] int,[GOODSID] int,[SQT] int,[IQT] int,[OQT] int,[CQT] int,[NGOODSID] int,[DD1] varchar(3),[DD2] varchar(3))
    insert [TB]
    select 1001,3001,100,30,40,80,8001,'DDA','DDB' union all
    select 1001,3001,100,30,40,80,8003,'DDB','DDC' union all
    select 1001,3001,100,30,40,80,8005,'DDK','DDB' union all
    select 1001,3002,100,30,40,80,8005,'DDK','DDB' union all
    select 1001,3008,100,30,40,80,8007,'DDB','DDC' union all
    select 1001,3008,100,30,40,80,8008,'DDK','DDB'
    update TB set [SQT]=0,[IQT]=0,[OQT]=0,[CQT]=0 from TB t where exists 
    (select 1 from TB where [STOREID]+[GOODSID]+[SQT]+[IQT]+[OQT]+[CQT]=t.[STOREID]+t.[GOODSID]+t.[SQT]+t.[IQT]+t.[OQT]+t.[CQT] and t.[NGOODSID]>[NGOODSID])select * from TB/*
    STOREID     GOODSID     SQT         IQT         OQT         CQT         NGOODSID    DD1  DD2
    ----------- ----------- ----------- ----------- ----------- ----------- ----------- ---- ----
    1001        3001        100         30          40          80          8001        DDA  DDB
    1001        3001        0           0           0           0           8003        DDB  DDC
    1001        3001        0           0           0           0           8005        DDK  DDB
    1001        3002        100         30          40          80          8005        DDK  DDB
    1001        3008        100         30          40          80          8007        DDB  DDC
    1001        3008        0           0           0           0           8008        DDK  DDB(6 行受影响)
    */
    drop table TB
      

  3.   

    谢谢大家的回复
    (SELECT 1 FROM TB WHERE T.STOREID=STOREID AND T.GOODSID=GOODSID AND T.SQT=SQT  AND 
     IQT=T.IQT AND  OQT=T.OQT AND T.CQT=CQT AND NGOODSID <T.NGOODSID )请问这里为什么用 AND NGOODSID <T.NGOODSID
      

  4.   

     STOREID, GOODSID , SQT, IQT, OQT, CQT 均相同时只保留一行
    NGOODSID <T.NGOODSID 这样做保证 你不为0 的那行为第一行。。
      

  5.   

    呵呵,直接加个LTRIM()也行呐,不过要写很长