求查询语句

99归一 2012-04-26 09:51:35

--测试数据:

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(部分寄存)
不知道叙述的清不清楚,谢啦!
...全文
120 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
99归一 2012-04-26
  • 打赏
  • 举报
回复
错了:select * from treas_authorizevoucher t where ((IsCancel =1) or ((IsRefundment = 1) and (ConfirmLiquidation is null or ConfirmLiquidation = 0)))
99归一 2012-04-26
  • 打赏
  • 举报
回复
select * from treas_authorizevoucher t where ((IsCancel = 1) or ((IsRefundment = 1) and (ConfirmLiquidation = null or ConfirmLiquidation = 0)))
试试
wxdfire 2012-04-26
  • 打赏
  • 举报
回复
select * from treas_authorizevoucher t where ((IsCancel == 1) or ((IsRefundment == 1) and (ConfirmLiquidation == null or ConfirmLiquidation == 0)))

报错缺少表达式 怎么回事啊
99归一 2012-04-26
  • 打赏
  • 举报
回复
海哥威武呀,膜拜
昵称被占用了 2012-04-26
  • 打赏
  • 举报
回复
3

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

昵称被占用了 2012-04-26
  • 打赏
  • 举报
回复
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
)

昵称被占用了 2012-04-26
  • 打赏
  • 举报
回复
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
)
ILOVE_ASPNET 2012-04-26
  • 打赏
  • 举报
回复


--查询结果: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
*/


不知是否理解的正确?? 第三种不太明白意思

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧