Кросс-таблица PostgreSQL с тремя столбцами, значения которых суммируются из одного столбца - PullRequest
7 голосов
/ 15 января 2012

Я новичок в SQL и пытался сделать кросс-таблицу в Postgres. Я бы сделал это в Excel, но у меня есть база данных, содержащая около 3,5 миллионов строк, 20 000 различных значений для кода, 7 категорий в cat и значения переменных от 1 до 100. Код может иметь только несколько из 7 категорий.

Excel не может обработать количество строк, поэтому SQL это так.

Мои данные в форме

code   |  cat        |   value |
--------------------------------
abc123 |   1         |    4    |
abc234 |   2         |    6    |
abc345 |   1         |    1    |
abc123 |   3         |    2    |
abc123 |   6         |    12   |

с кодом и cat в качестве текста, значение в виде целого числа, хранящегося в таблице Postgres.

Я хотел бы выполнить кросс-таблицу для кода и кошки с суммой значений. Я хотел бы, чтобы в нём вместо нуля показывалось ноль, но если бы ноль был более простым запросом, то это было бы хорошо.

Итак, я бы хотел получить вывод

code   |   'cat=0' | 'cat=1' | 'cat=2' | 'cat=3' | 'cat=4' | 'cat=5' | 'cat=6'|
abc123 |    25     |  0      |  3      |  500    | 250     | 42      |  0     |
abc234 |     0     |  100    |  0      |   10    |  5      |  0      |   25   |
abc345 |    1000   |   0     |  0      |    0    |  0      |  0      |   0    |

Я искал в файлах справки Postgres и других форумах; самым близким был вопрос SO PostgreSQL Crosstab Query , но я не мог понять, как суммировать значения из третьего столбца.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

7 голосов
/ 03 января 2013

Я получил это, обновив мой код до следующего:

select * from crosstab(
'select code, cat, sum(value) as value
 from my_table 
 group by code, cat
 order by 1,2'
) as ct(code varchar(255),
    cat_0 bigint,
    cat_1 bigint, 
    cat_2 bigint, 
    cat_3 bigint, 
    cat_4 bigint, 
    cat_5 bigint, 
    cat_6 bigint)

Мне удалось определить правильный тип данных, выполнив оператор select внутри кросс-таблицы и сопоставив типы данных my as ct с типами, возвращенными запросом внутри кросс-таблицы.

3 голосов
/ 15 января 2012

Попробуйте:

select * from crosstab(
'select code, cat, sum(value) as value
 from my_table 
 group by code, cat
 order by 1,2'
) as ct(code text,
        cat_0 int,
        cat_1 int, 
        cat_2 int, 
        cat_3 int, 
        cat_4 int, 
        cat_5 int, 
        cat_6 int)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...