2017-08-01 21 views
0

ランキングでトップのアカウントの販売を得る:Postgresは、私は以下の表を持っている

Account (id, name) 
Solution (id, name) 
Sales (solution_id, account_id, month, year, amount) 

私は、特定の期間内に各アカウントの月次売上高を計算する必要があります。

SELECT 
    to_char(make_date(sales.year, sales.month, 1), 'YYYY-MM') AS period, 
    acc.id AS account_id, 
    acc.name AS account_name, 
    COALESCE(SUM(sales.net_sales), 0) AS amount 
FROM 
    (SELECT * 
    FROM sales 
    WHERE make_date(year, month, 1) >= FROM_DATE 
    AND make_date(year, month, 1) <= TO_DATE) sales 
    INNER JOIN account acc.id = sales.account_id 
GROUP BY sales.year, sales.month 
ORDER BY sales.year, sales.month ASC 

私は今、計算することができます範囲内の期間内の総売上高:

SELECT 
    to_char(make_date(sales.year, sales.month, 1), 'YYYY-MM') AS period, 
    acc.id AS account_id, 
    acc.name AS account_name, 
    COALESCE(SUM(sales.net_sales), 0) AS amount 
FROM 
    (SELECT *, COALESCE(SUM(net_sales) OVER (PARTITION BY client_id), 0) AS total 
    FROM sales 
    WHERE make_date(year, month, 1) >= FROM_DATE 
    AND make_date(year, month, 1) <= TO_DATE) sales 
    INNER JOIN account acc.id = sales.account_id 
GROUP BY sales.year, sales.month 
ORDER BY sales.year, sales.month ASC 

順番に合計売上をランク付けする方法はありますか選択した期間内に最高のアカウントをnにするだけですか?

+0

使用ROW_NUMBER()関数を – areklipno

答えて

1

あなたの質問はちょっと混乱しています。最初は構文的に正しいものではありません。私はあなたが単純化することができると思うと意図がある:

SELECT to_char(make_date(s.year, s.month, 1), 'YYYY-MM') AS period, 
     a.id AS account_id, a.name AS account_name, 
     COALESCE(SUM(s.net_sales), 0) AS amount, 
     SUM(SUM(s.net_sales)) OVER (PARTITION BY a.id) as total 
FROM sales s INNER JOIN 
    account a 
    ON a.id = s.account_id 
WHERE make_date(s.year, s.month, 1) >= FROM_DATE AND 
     make_date(s.year, s.month, 1) <= TO_DATE 
GROUP BY s.year, s.month, a.id, a.name 
ORDER BY s.year, s.month ASC; 

あなたは総売上高(または月次売上)によってランク付けしたい場合は、dense_rank()使用することができます。

SELECT ym.* 
FROM (SELECT to_char(make_date(s.year, s.month, 1), 'YYYY-MM') AS period, 
      a.id AS account_id, a.name AS account_name, 
      COALESCE(SUM(s.net_sales), 0) AS amount, 
      total, 
      DENSE_RANK() OVER (ORDER BY total DESC) as seqnum 
     FROM (SELECT s.*, SUM(s.net_sales) OVER (PARTITION BY client_id) as total 
      FROM sales s 
      ) s INNER JOIN 
      account a 
      ON a.id = s.account_id 
     WHERE make_date(s.year, s.month, 1) >= FROM_DATE AND 
      make_date(s.year, s.month, 1) <= TO_DATE 
     GROUP BY s.year, s.month 
    ) ym 
WHERE seqnum <= 3 
ORDER BY s.year, s.month ASC; 
関連する問題