Cla*_*vis 3 sql sql-server select
我需要帮助构建一个SQL查询,该查询返回仅订购一次的客户的订单.
表格和相关字段如下:
Order Customer
------- -----------
orderId customerId
orderDate
customerId
etc.
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个订单记录的结果集,其中只有一个客户ID出现.对于以下数据集......
[orderId] [customerId] [orderDate] [etc.]
---------- ------------ ------------ ------------
o1 c1 1/1/14 foo
o2 c2 1/1/14 baz
o3 c3 1/3/14 bar
o4 c2 1/3/14 wibble
Run Code Online (Sandbox Code Playgroud)
我希望结果如何
[orderId] [orderDate] [etc.]
--------- ----------- ------
o1 1/1/14 foo
o3 1/3/14 bar
Run Code Online (Sandbox Code Playgroud)
订单o2和o4被省略,因为c2订购了两次.
任何帮助将不胜感激.
对不起,没有把我失败的尝试.这就是我试过的......
SELECT customerId,
orderId,
orderDate,
Count(*)
FROM Orders
GROUP BY orderId,
orderDate,
customerID
HAVING Count(*) = 1
ORDER BY orderId
Run Code Online (Sandbox Code Playgroud)
它似乎返回所有订单.
Lam*_*mak 14
尝试以下(假设SQL Server 2005+):
;WITH CTE AS
(
SELECT *,
N = COUNT(*) OVER(PARTITION BY customerId)
FROM Orders
)
SELECT *
FROM CTE
WHERE N = 1
Run Code Online (Sandbox Code Playgroud)
由于有时行人方法比复杂的CTE更受欢迎,因此如果需要,可以使用派生表(但由于它使用了该OVER
子句,您仍然需要SQL Server 2005+):
SELECT *
FROM ( SELECT *,
N = COUNT(*) OVER(PARTITION BY customerId)
FROM Orders) T
WHERE N = 1
Run Code Online (Sandbox Code Playgroud)
或者(例如,如果您使用的是旧版本的SQL-Server),您可以使用该GROUP BY / HAVING COUNT(*)=1
方法查找只有1个订单的客户,然后再加入Orders
表中(不需要在所有列中使用聚合函数):
SELECT o.*
FROM Orders o
JOIN
( SELECT customerId
FROM Orders
GROUP BY customerId
HAVING COUNT(*) = 1
) c
ON c.customerId = o.customerId ;
Run Code Online (Sandbox Code Playgroud)
或使用NOT EXISTS
(COUNT()
不需要,甚至在MySQL中也可以):
SELECT o.*
FROM Orders o
WHERE NOT EXISTS
( SELECT 1
FROM Orders c
WHERE c.customerId = o.customerId
AND c.orderId <> o.orderId
) ;
Run Code Online (Sandbox Code Playgroud)