需要关于看似简单的SQL查询的提示

时间:2012-05-21 14:43:21

标签: sql select count sql-server-2008-r2

我尝试做类似的事情:

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

没有错误但没有结果..

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

如果你真的希望能够选择Customers中的所有列而不指定名称(please read this blog post in full以避免这种情况,并且易于解决方法),那么你可以做这个懒惰的速记代替:

;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;

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

答案 2 :(得分: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