Sql 指定所有行在另一个表中至少出现特定次数

Sql 指定所有行在另一个表中至少出现特定次数,sql,join,group-by,having,Sql,Join,Group By,Having,我正在使用这个示例,我想在表Customers和Orders上编写一个查询,该查询提供了所有已下了2个以上订单的客户。尽管我通过查询实现了这一点: Select Customers.* From Customers Where Customers.CustomerID IN( Select Orders.CustomerID From Orders Group by Orders.CustomerID Having count(*)>2 ); SELECT Customers.* FRO

我正在使用这个示例,我想在表
Customers
Orders
上编写一个查询,该查询提供了所有已下了2个以上订单的客户。尽管我通过查询实现了这一点:

Select Customers.*
From Customers
Where Customers.CustomerID IN(
Select Orders.CustomerID
From Orders
Group by Orders.CustomerID
Having count(*)>2
);
SELECT Customers.*
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID
GROUP BY Customers.CustomerID
HAVING COUNT(*)>2;
我不明白为什么会有这样的疑问:

Select Customers.*
From Customers
Where Customers.CustomerID IN(
Select Orders.CustomerID
From Orders
Group by Orders.CustomerID
Having count(*)>2
);
SELECT Customers.*
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID
GROUP BY Customers.CustomerID
HAVING COUNT(*)>2;
不能给出相同的结果。来自数据库的消息是:

“无法对使用“*”选择的字段进行分组(客户)。”

我觉得它应该可以工作,因为
Customers.CustomerID
包含在
Select
语句中的required列中。问题是什么?我如何修改第二个查询才能工作,即使它可能会排除多余的语句

来自

GROUP BY语句与聚合一起使用 函数按一列或多列对结果集进行分组

因此,要使用聚合,您需要指定聚合的列,并且不能使用
*


您必须在
SELECT
groupby
子句中明确指定列。

SELECT
语句中指定所需的列:

SELECT Customers.CustomerID, Customers.CustomerName
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID
GROUP BY Customers.CustomerID, Customers.CustomerName
HAVING COUNT(*)>2;

第一个解决方案实际上由两个查询组成

第二部分通过列出CustomerID来确定退货客户

        Select o.CustomerID
    From Sales.SalesOrderHeader o
    Group by o.CustomerID
    Having count(*)>2
第一部分使用第二次查询得到的返回客户列表显示客户详细信息

Select c.*
From Sales.Customer c
Where 
c.CustomerID IN(
    ...
);
尝试使用订单表上的Group By语法获取dublicate客户ID时,无法返回所有客户数据

但这里可以使用带有PARTITION By子句的SQL聚合函数(下面的Count函数)代替Group By 请查看教程并查看以下查询

select * from (
SELECT distinct
    c.*,
    COUNT(o.SalesOrderID) over (partition by c.CustomerId) cnt
FROM Sales.SalesOrderHeader o
INNER JOIN Sales.Customer c ON o.CustomerID = c.CustomerID
) t where cnt > 1

我已经尝试了你的建议,它的工作,但它只提供ID。为了获得完整信息,我需要将其放入子查询中,并在外部查询中将其与In或EXISTS进行匹配。它可以在这些特定表上运行,但我想知道如果两个客户的名称相同,是否会出现问题。可能不会,因为两者都是分组的。我说得对吗?你说得对,但在这种情况下,你应该从
选择
分组方式中删除
客户。CustomerID