我尝试做类似的事情:
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
没有错误但没有结果..
答案 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