2014-10-17 2 views
0

Итак, у меня есть таблица с тремя важными столбцами: местоположение магазина, клиент и количество покупок. Что-то наподобие:Подсчитывает, сколько раз каждое значение происходит в таблице PostgreSQL?

Что я хотел бы сделать, это получить количество каждого количества покупок. То есть, подсчитывайте количество покупок, сделанных клиентом 1, 2 покупки, 3 покупки, 4 покупки и т. Д., Как гистограмма, сгруппированная по магазинам.

Store | 1 Purchase | 2 Purchases | 3 Purchases... 
A   1    3     2 
B   2    1     4 
C   1    6     8 
D   4    4     2 

Есть ли умный способ сделать это без ручного выяснения того, что максимальное количество покупок является и создания разветвленного подсчета для подсчета каждый из них? Так что я уже

SELECT Store, 
     Count(CASE number_of_purchases when 1 then 1 else null end) as 1_purchase, 
     Count(CASE number_of_purchases when 2 then 1 else null end) as 2_purchase, 
     Count(CASE number_of_purchases when 3 then 1 else null end) as 3_purchase... 
FROM table 
GROUP BY Store; 

Но, так как максимальное число может меняться с течением времени, я хотел бы запрос, чтобы вычислить его автоматически и принимать это во внимание. Любая помощь будет оценена!

+0

Исправлено это, спасибо за наконечник. – user2900369

+2

Что вы ищете, это запрос «pivot» или «crosstab». Проверьте функцию 'crosstab' в расширении' tablefunc': http://www.postgresql.org/docs/current/static/tablefunc.html. –

ответ

1

Чтобы получить правильные данные данные, все, что вам нужно, это group by и функция агрегата.

select store, number_of_purchases, count(number_of_purchases) 
from Table1 
group by store, number_of_purchases 
order by store, number_of_purchases; 

Для формата вам необходимо использовать одну из функций кросс-таблицы() в расширении tablefunc. Что-то в этом роде.

select * 
from crosstab('select store, number_of_purchases, count(number_of_purchases) 
       from Table1 
       group by store, number_of_purchases 
       order by 1, 2', 
       'select n from generate_series(1, 12) n order by 1') 
    as (store text, "1" int, "2" int, "3" int, "4" int, 
        "5" int, "6" int, "7" int, "8" int, 
        "9" int, "10" int, "11" int, "12" int) 
; 

Лично мне не нравятся кросс-таблицы для такого рода данных. Вы можете получить вывод, который содержит сотни или тысячи столбцов, причем большая часть «ячеек» пуста.

0

Попробуйте это:

SELECT 
    Store, number_of_purchases, COUNT(DISTINCT number_of_purchases) AS cnt 
FROM table 
GROUP BY Store, number_of_purchases 

В результате будут организованы в строки (не в колонках), потому что вы не знаете, что максимальное количество покупок для каждого магазина.

Это будет легко зацикливаться на результате, так как они будут заказаны в магазине и number_of_purchases.

Смежные вопросы