从两个表中选择,基于2列,其中一列不能是不同的

时间:2018-03-08 16:03:20

标签: sql sql-server-2008

假设我有2个表,一个存储项目信息,第二个用于跟踪链接到所述项目的各种数量。

我的商品有订单号,身份证号码和批号。第二表I中感兴趣的数量是"数量准备好" (我有多少库存),"订购数量" (已订购了多少客户)和#34;已发货数量" (我已经发了多少)。两个表都有更多数据,但我不需要它来进行此查询。

我想要的是:一个查询将向我返回所有包含多个批号的商品的订单号(因此,如果商品只有一个不同的批号,我不希望它在结果中),我已经有一些(所以qty_ready> 0)并且我发运了一些,但不是我的所有订单(所以qty_shipped< qty_ordered)。

示例:

表项目:

+-------+--------+------------------+
| IdNum | LotNum | Someothercolumns |
+-------+--------+------------------+
|     1 | 10-00  |              123 |
|     2 | 10-01  |              123 |
|     2 | 10-02  |              123 |
|     3 | 10-03  |              123 |
|     3 | 10-04  |              123 |
+-------+--------+------------------+

表项目数量:

+----------+---------+-----------+-------------+-------------+-----+
| orderNum | idNum   | qty_ready | qty_ordered | qty_shipped |other|
+----------+---------+-----------+-------------+-------------+-----+
| O1       |       1 |        10 |           5 |           3 | 123 |
| O2       |       2 |        10 |          10 |          10 | 123 |
| O3       |       2 |        10 |           5 |           3 | 123 |
| O4       |       3 |         0 |          10 |           5 | 123 |
| O5       |       3 |         0 |           5 |           5 | 123 |
+----------+---------+-----------+-------------+-------------+-----+

这里我只想要O3并返回它的数据,因为:

  • O1 - 商品1只有一个lot与之关联
  • O2 - 商品2有多个lot,但订单已经完成 (订购10件,送10件)
  • O4 - 项3有多个,但是 qty_ready不是> 0
  • O5 - 项3有多个,但是 qty_ready不是> 0已经完成(5个订购,5个 发送)

这是我对查询的尝试 - 尽管它返回数据,但它确实返回了许多重复的行(如果一个项目有4个批次,我会得到每个结果4次,所以16行)。我怀疑我的加入是问题,但我似乎无法找到它:

;with noo as (select count(LotNum) over(partition by LotNum) as temp,  Item.* 
from Item
inner join ItemQty on ItemQty.idNum = Item.idNum 
where Item.idNum in 
(select t1.idNum 
from Item t1
inner join Item t2 on t1.idNum = t2.idNum 
where t1.LotNum <> t2.lotNum) and qty_shipped < qty_ordered and qty_ready > 0)
select * from noo where temp > 1
order by idNum desc

1 个答案:

答案 0 :(得分:1)

select * from itemqty
where idnum in 
(select idnum from item group by idnum having count(*) > 1)
and qty_ready > 0
and qty_ordered > qty_shipped
and qty_shipped > 0

sqlfiddle