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;

このソリューションは、すべての列でグループ化するよりもはるかにクリーンだと思います。最初に注文テーブルでグループ化し、次に各顧客行に 1 回結合する方が、最初に結合してからグループ化するよりもはるかに効率的である可能性があります。

于 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 に答える