用于查找数量为1的唯一订单的SQL查询

时间:2015-06-01 19:20:27

标签: sql sql-server

我有一个名为OrderItems的表。我想写一个返回数量= 1的行的查询,但如果有任何其他记录具有相同的OrderID,我不想要返回任何内容。

Id  OrderID  Qty  SKU
1   123      1    abc123
2   124      2    sho221
3   125      1    toy903
4   125      3    ball05
5   155      1    gree32

使用上面的示例数据,我希望仅返回订单123和155,因为它们适用于数量为1的单个SKU。订单125有两个SKU,即使第一个(Id 3)的数量为1 ,另一个(Id 4)的数量为3,所以我不希望这些订单返回。

到目前为止,我正在玩的查询是:

SELECT o.Id 
FROM Orders o
INNER JOIN OrderItems oi
ON oi.OrderId = o.Id 
WHERE oi.Quantity = 1 
GROUP BY eo.Id

但是这个查询没有考虑具有多个SKU的订单,只是订单碰巧有SKU的数量为1。

用简单的英语 - 我想找到只包含一个SKU的订单,而且这些订单必须有一个数量。

6 个答案:

答案 0 :(得分:4)

我认为你也可以这样做:

SELECT
  oi.OrderId, 
  sum(oi.Quantity) 
FROM 
  Orders o
  INNER JOIN OrderItems oi
    ON oi.OrderId = o.Id 
group by
  oi.OrderId
having
  sum(oi.Quantity) = 1 and
  count(*) = 1

答案 1 :(得分:3)

您没有指定SQL Server版本,但使用组计数将无需加入OrderItems

select * 
from
 (
   select *, 
      count(*) over (partition by orderId) as cnt
   from OrderItems
 ) dt 
where cnt = 1 and Qty = 1

Fiddle

如果效率更高取决于实际数据......

答案 2 :(得分:2)

为每个订单添加您的订单数量否,如果它是一个,那就是您需要的。 要选择任何列,您可以再次加入orderItem表

select * from 
            OrderItems x inner join
            (
                 select orderId, sum(Qty) AS NetQty
                from OrderItems
                group by orderId
               having sum(Qty) =1
             ) t 
on t.orderId = x.orderId

SQL Fiddle

答案 3 :(得分:2)

一种简单的方法是使用窗口函数:

select oi.*
from (select oi.*, sum(oi.quantity) over (partition by oi.OrderId) as totqty
      from OrderItems oi
     ) oi
where totqty = 1;

该版本很不错,因为您可以轻松获取OrderItems中的所有列。如果您只想要订单ID:

select oi.orderid
from OrderItems oi
group by oi.orderid
having sum(oi.quantity) = 1;

这两者的关键是joinOrders是不必要的。

答案 4 :(得分:0)

您可以使用exists运算符检查相同SKU的其他项目

SELECT *
FROM   orders a
WHERE  qty = 1 AND
       NOT EXISTS (SELECT *
                   FROM   orders b
                   WHERE  a.orderid = b.orderid AND a.id != b.id)

答案 5 :(得分:0)

表现:

SELECT o.Id 
FROM Orders o
  INNER JOIN OrderItems oi
    ON oi.OrderId = o.Id 
  LEFT JOIN OrderItems oi1
    ON oi.OrderId = oi1.OrderId
       AND oi.Id <> oi1.Id
WHERE oi.Qty = 1 
  AND oi1.id IS NULL