Нужен запрос postgresql для группировки и заказа - PullRequest
2 голосов
/ 31 августа 2010

У меня есть таблица клиентов следующим образом:

customername, ordername, amount
=============================
bob, book,     20
bob, computer, 40
steve,hat,     15
bill, book,    12
bill, computer, 3
steve, pencil, 10
bill, pen,      2

Я хочу выполнить запрос, чтобы получить следующий результат:

customername, ordername, amount
=============================
bob,   computer, 40
bob,   book,     20
bob,   ~total~,  60
steve, hat,      15
steve, pencil, 10
steve, ~total~,25 
bill, book,    12
bill, computer, 3
bill, pen,      2 
bill, ~total~, 17

Я хочу, чтобы сумма для каждого клиента была заказана от максимального до минимального, а новое имя заказа было указано как «~ total ~» (всегда должно быть последней строкой для каждого клиента), а результат - сумма всех сумм для одного и того же клиента. , Таким образом, в приведенном выше примере Боб должен быть первым, так как общее число = 60, Стив второе (общее число = 25) и выставить счет третьему (общее число = 17).

1 Ответ

8 голосов
/ 31 августа 2010

Использование:

SELECT x.customername,
       x.ordername,
       x.amount
  FROM (SELECT a.customername,
               a.ordername,
               a.amount,
               y.rk,
               1 AS sort
          FROM CUSTOMERS a
          JOIN (SELECT c.customername,
                       ROW_NUMBER() OVER (ORDER BY SUM(c.amount) DESC) AS rk
                  FROM CUSTOMERS c
              GROUP BY c.customername) y ON y.customername = a.customername
        UNION ALL
        SELECT b.customername,
               '~total~',
               SUM(b.amount),
               ROW_NUMBER() OVER (ORDER BY SUM(b.amount) DESC) AS rk,              
               2 AS sort
          FROM CUSTOMERS b
      GROUP BY b.customername) x
ORDER BY x.rk, x.customername, x.sort, x.amount DESC

Можно использовать GROUP BY ROLLUP, но значение ordername будет равно NULL, поэтому вам придется постобработать его, чтобы заменить его на "~ total~»...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...