2

我正在尝试做类似的事情:

SELECT c.id, c.name, COUNT(orders.id)
FROM customers c
JOIN orders o ON o.customerId = c.id

但是,SQL 不允许使用 COUNT 函数。执行时给出的错误是 c.Id 在选择列表中无效,因为它不在 group by 子句中或未聚合。

我想我知道问题所在, COUNT 只计算表中的所有orders。我如何计算每个客户的数量?

编辑

完整的查询,但它是荷兰语......这是我试过的:

select k.ID,
       Naam,
       Voornaam,
       Adres,
       Postcode,
       Gemeente,
       Land,
       Emailadres,
       Telefoonnummer,
       count(*) over (partition by k.id) as 'Aantal bestellingen',
       Kredietbedrag,
       Gebruikersnaam,
       k.LeverAdres,
       k.LeverPostnummer,
       k.LeverGemeente,
       k.LeverLand
from klanten k
  join bestellingen on bestellingen.klantId = k.id

没有错误,但也没有结果..

4

3 回答 3

5

使用这样的聚合函数时,您需要按任何非聚合的列进行分组:

SELECT c.id, c.name, COUNT(orders.id)
FROM customers c
JOIN orders o ON o.customerId = c.id
GROUP BY c.id, c.name
于 2012-05-21T14:45:45.157 回答
2

如果您真的希望能够在Customers不指定名称的情况下选择所有列(请完整阅读此博客文章以避免这种情况以及简单的解决方法),那么您可以改用这种懒惰的速记:

;WITH o AS 
(
  SELECT CustomerID, CustomerCount = COUNT(*)
  FROM dbo.Orders GROUP BY CustomerID
)
SELECT c.*, o.OrderCount
FROM dbo.Customers AS c
INNER JOIN dbo.Orders AS o
ON c.id = o.CustomerID;

编辑您的真实查询

SELECT 
  k.ID, 
  k.Naam, 
  k.Voornaam, 
  k.Adres, 
  k.Postcode, 
  k.Gemeente, 
  k.Land, 
  k.Emailadres, 
  k.Telefoonnummer,
  [Aantal bestellingen] = o.klantCount, 
  k.Kredietbedrag, 
  k.Gebruikersnaam, 
  k.LeverAdres, 
  k.LeverPostnummer, 
  k.LeverGemeente, 
  k.LeverLand
FROM klanten AS k 
INNER JOIN 
(
  SELECT klantId, klanCount = COUNT(*)
  FROM dbo.bestellingen 
  GROUP BY klantId
) AS o
ON k.id = o.klantId;

我认为这个解决方案比按所有列分组要干净得多。首先对订单表进行分组,然后将每个客户行加入一次可能比先加入然后分组更有效。

于 2012-05-21T14:53:29.187 回答
1

以下将计算每个客户的订单,而不需要按 customer.id 对整体查询进行分组。但这也意味着对于有多个订单的客户,每个订单都会重复该计数。

 SELECT c.id, c.name, COUNT(orders.id) over (partition by c.id)
 FROM customers c
   JOIN orders ON o.customerId = c.id
于 2012-05-21T14:50:03.970 回答