--测试数据:create table #tb (id int ,order_id int, product_id int,order_qty int ,valid_qty int)
go
insert into #tb 
select 2017170000,1051570000,3630000,1,0 union all
select 2017180000,1051580000,1500000,8,8 union all
select 2017190000,1051590000,5520000,3,0 union all
select 2017200000,1051600000,8170000,10,0 union all
select 2017210000,1051590000,5620000,4,0 union all
select 2017220000,1051600000,8070000,1,0 union all
select 2017230000,1051590000,7700000,2,0 union all
select 2017240000,1051590000,8070000,1,0 union all
select 2017250000,1051610000,8180000,5,0 union all
select 2017260000,1051610000,8070000,5,0 union all
select 2017270000,1051620000,8280000,3,0 union all
select 2017280000,1051620000,5520000,3,0 union all
select 2017290000,1051620000,8170000,20,0 union all
select 2017300000,1051630000,7700000,6,0 union all
select 2017310000,1051620000,5580000,6,0 union all
select 2017320000,1051620000,8070000,1,0 union all
select 2017330000,1051630000,3810000,1,0 union all
select 2017340000,1051620000,3650000,1,0 union all
select 2017350000,1051640000,120000,2,0 union all
select 2017360000,1051640000,2260000,1,0 union all
select 2017370000,1051640000,8280000,8,0 union all
select 2017380000,1051650000,1500000,4,0 union all
select 2017390000,1051660000,8380000,1,0 union all
select 2017400000,1051670000,8070000,1,0 union all
select 2017410000,1051680000,7770000,6,0 union all
select 2017420000,1051690000,5570000,6,0
这是个寄存表,一个寄存表中有多笔订单,一笔订单中寄存多中商品,一笔订单中寄存商品数是不确定的(order_id出现次数是不定的)
查询结果:1:同一个order_id中每种product_id中的valid_qty=0选出该order_id(属于完全发货)
查询结果:2:同一个order_id中每种product_id中的order_qty都和该product_id对应的valid_qty相等时选出order_id(完全寄存)
查询结果:3:同一个order_id中只要有一种product_id中的order_valid和valid_order(不包括第一种情况,每种product_id中的valid_qty=0)不相等时选出order_id(部分寄存)
不知道叙述的清不清楚,谢啦!

解决方案 »

  1.   

    1
    SELECT DISTINCT order_id FROM #TB A
    WHERE valid_qty=0
    AND NOT EXISTS (
      SELECT 1
      FROM #TB
      WHERE order_id = A.order_id
      AND valid_qty<>0
      )
      

  2.   

    2
    SELECT DISTINCT order_id FROM #TB A
    WHERE valid_qty=order_qty
    AND NOT EXISTS (
      SELECT 1
      FROM #TB
      WHERE order_id = A.order_id
      AND valid_qty<>order_qty
      )
      

  3.   

    3SELECT DISTINCT order_id FROM #TB A
    WHERE valid_qty<>order_qty
    AND valid_qty<>0
    OR valid_qty=order_qty
    AND EXISTS (
      SELECT 1
      FROM #TB
      WHERE order_id = A.order_id
      AND valid_qty<>order_qty
      )
    OR valid_qty=0
    AND EXISTS (
      SELECT 1
      FROM #TB
      WHERE order_id = A.order_id
      AND valid_qty<>0
      )
      

  4.   

    select * from treas_authorizevoucher t where ((IsCancel == 1) or ((IsRefundment == 1) and (ConfirmLiquidation == null or ConfirmLiquidation == 0)))报错缺少表达式 怎么回事啊
      

  5.   

    select * from treas_authorizevoucher t where ((IsCancel = 1) or ((IsRefundment = 1) and (ConfirmLiquidation = null or ConfirmLiquidation = 0)))
    试试
      

  6.   

    错了:select * from treas_authorizevoucher t where ((IsCancel =1) or ((IsRefundment = 1) and (ConfirmLiquidation is null or ConfirmLiquidation = 0)))
      

  7.   

    --查询结果:1:同一个order_id中每种product_id中的valid_qty=0选出该order_id(属于完全发货)
    SELECT * FROM
    (
     SELECT RESULT = ROW_NUMBER()OVER(PARTITION BY ORDER_ID ORDER BY order_id),* FROM #tb
     WHERE valid_qty=0 
     ) 
    T WHERE T.RESULT=1
    ORDER BY RESULT
    /*
    RESULT               id          order_id    product_id  order_qty   valid_qty
    -------------------- ----------- ----------- ----------- ----------- -----------
    1                    2017170000  1051570000  3630000     1           0
    1                    2017190000  1051590000  5520000     3           0
    1                    2017220000  1051600000  8070000     1           0
    1                    2017250000  1051610000  8180000     5           0
    1                    2017270000  1051620000  8280000     3           0
    1                    2017330000  1051630000  3810000     1           0
    1                    2017350000  1051640000  120000      2           0
    1                    2017380000  1051650000  1500000     4           0
    1                    2017390000  1051660000  8380000     1           0
    1                    2017400000  1051670000  8070000     1           0
    1                    2017410000  1051680000  7770000     6           0
    1                    2017420000  1051690000  5570000     6           0
    */--查询结果:2:同一个order_id中每种product_id中的order_qty都和该product_id对应的valid_qty相等时选出order_id(完全寄存
    SELECT * FROM
    (
     SELECT RESULT = ROW_NUMBER()OVER(PARTITION BY ORDER_ID ORDER BY order_id),* FROM #tb
     WHERE order_qty=valid_qty
     ) 
     T WHERE T.RESULT=1
    ORDER BY RESULT
    /*
    RESULT               id          order_id    product_id  order_qty   valid_qty
    -------------------- ----------- ----------- ----------- ----------- -----------
    1                    2017180000  1051580000  1500000     8           8
    */
    不知是否理解的正确?? 第三种不太明白意思