0

PostgreSQL でのクエリ: 同じ月に 4 件以上の請求書があるセールスマンの名前を表示します。

テーブル: articles, customers, invoices, lines_invoice, province, towns, sellers.

私のクエリは、同じ月にあるカウントを気にせずに値を返します。どうすればそれを行うことができますか?

select s.codseller, s.name 
from sellers s 
join invoices i using (codseller) 
group by s.codseller 
having count (codinvoice) > 4;

ありがとう!

編集:

画面に表示される正しい解決策は次のとおりです。 結果

codven = codseller nombre = 名前

私のクエリでは、別の月に 4 つ以上の請求書を持つセールスマンをカウントするため、余分な 2 つの行が表示されます。

4

2 に答える 2

2
SELECT s.id, s.name
      ,date_trunc('month', i.sales_date::timestamp) AS month
      ,COUNT(i.id) AS invoices_for_month
  FROM seller s
  INNER JOIN invoices i ON (s.id = i.seller_id)
  GROUP BY s.id, s.name, date_trunc('month', i.sales_date::timestamp)
  HAVING COUNT(i.id) > 4

テストした環境:

CREATE TABLE seller (id int, name text);
INSERT INTO seller VALUES(1, 'Joe');
INSERT INTO seller VALUES(2, 'Mike');
INSERT INTO seller VALUES(3, 'Tom');

CREATE TABLE invoices(id int, seller_id int, sales_date date);
INSERT INTO invoices VALUES(1, 1, now());
INSERT INTO invoices VALUES(2, 1, now() - interval '35' day);
INSERT INTO invoices VALUES(3, 1, now() - interval '37' day);
INSERT INTO invoices VALUES(4, 1, now() - interval '39' day);
INSERT INTO invoices VALUES(5, 1, now() - interval '40' day);
INSERT INTO invoices VALUES(6, 1, now() - interval '40' day);
INSERT INTO invoices VALUES(7, 2, now());
于 2012-05-20T01:36:31.970 に答える
1

答えはここに残しておきますが、グレンの答えの方が優れています

group_by 句で月を抽出する必要があります (未テスト):

select s.codseller, 
EXTRACT(MONTH FROM i.date) as month, 
EXTRACT(YEAR FROM i.date) as year, s.name 
from sellers s 
join invoices i using (codseller) 
group by s.codseller, month, year
having count (codinvoice) > 4;

日時フィールドしかない場合、月と年でグループ化するにはどうすればよいですか? もご覧ください。

また、postgresqls datetime functionsも見てください。

于 2012-05-20T01:34:33.377 に答える