Создавайте Postgres Pivot как excel

Мне нужна помощь в создании сводной таблицы. Я уже пробовал здесь много предлагаемых решений, но я застрял. Надеюсь, кто-то может помочь. Вот мой сценарий:

Таблица1 образец

ID              text    2712cb957
document_key    text    201808

Образец Table2

ID          text    2712cb957
amount_net  int     56000
classid     int     4021

Table3 (из Table1 и Table2 через внутренний идентификатор соединения)
document_key amount_net classid

201808          10          4021
201808          10          4021
201808          15          4023
201808          13          4023
201807          20          4021
201807          15          4021
…               …           …

Ожидаемая сводная таблица

document_key    4021    4023
201807          35      0
201808          20      28

Создавайте Postgres Pivot как excel

извините, это мой 1-й пост здесь. Пожалуйста, нажмите на ссылку изображения для получения подробной информации. Спасибо

Heiko O 18.09.2018 16:44

Вы заранее знаете, что вам нужны просто 4021 и 4023? Или это будет динамическим, в зависимости от того, сколько различных classid существует в вашей таблице?

JNevill 18.09.2018 16:45

привет, будет больше идентификаторов классов, так что да, это должно быть динамически

Heiko O 18.09.2018 16:46

Не беспокойтесь о форматировании всего этого. Чтобы сохранить пробелы и переводы строк, просто сделайте отступ каждой строки в таблицах / коде четырьмя пробелами. Вы также можете выделить блок и нажать кнопку {} в верхней части редактора. Я отредактировал этот вопрос, чтобы сделать именно это.

JNevill 18.09.2018 16:46

Заметил ;-), вот добрый с вашей стороны, цените!

Heiko O 18.09.2018 16:49

Dynamic Pivot в Postgres совсем не прост. Существует БОЛЬШОЙ напиши на этот вопрос, хотя он проведет вас через ключевое слово crosstab, как его применить и шаги, необходимые для создания чего-то динамического. Это одна из тех вещей, когда вы либо погружаетесь в функции, либо динамически генерируете кросс-таблицу / сводный запрос, а затем выполняете динамически сгенерированный sql.

JNevill 18.09.2018 16:49

Как правило, вывод динамической сводной / кросс-таблицы лучше всего передавать на уровень вашего приложения (если он существует). Это то место, где клиентское программное обеспечение для создания отчетов выделяется (например, таблицы, бизнес-объекты (? Я думаю), Excel и т. д.)

JNevill 18.09.2018 16:52

спасибо, как бы выглядело статическое решение, скажем, всего с 5 классами. Я использую Pentaho Kettle - именно здесь происходит вся ETL ....

Heiko O 18.09.2018 16:55

Извините за задержку. Это хороший простой пример статической кросс-таблицы.

JNevill 18.09.2018 17:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
135
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

демонстрация: db <> рабочий пример

Поворот статический может выглядеть так:


Postgres 9.4+

Postgres 9.4 добавляет функцию FILTER:

SELECT 
    document_key, 
    COALESCE(SUM(amount_net) FILTER (WHERE classid = 4021), 0) as "4021", -- A
    COALESCE(SUM(amount_net) FILTER (WHERE classid = 4023), 0) as "4023"
FROM test 
GROUP BY document_key
ORDER BY document_key

A: GROUP BY document_key объединяет все группы document_key. С помощью агрегатной функции SUM вы складываете все соответствующие значения amount_net. Функция FILTER используется для суммирования только этих значений из строк, содержащих classid = XYZ. COALESCE вокруг агрегата делает значения NULL равными 0.

Если вам нужно больше столбцов, скопируйте эту строку кода.


Postgres 9.3 и ниже

SELECT 
    document_key, 
    SUM(CASE WHEN classid = 4021 THEN amount_net ELSE 0 END) as "4021", 
    SUM(CASE WHEN classid = 4023 THEN amount_net ELSE 0 END) as "4023"
FROM test 
GROUP BY document_key
ORDER BY document_key

Спасибо, ваш образец выдает синтаксическую ошибку при первом появлении FILTER.

Heiko O 19.09.2018 09:36

Какую версию вы используете?

S-Man 19.09.2018 09:46

мы используем 9.3

Heiko O 19.09.2018 10:02

Вам действительно следует обновить свою базу данных, поскольку 9.3 больше не поддерживается. И вы упускаете много действительно замечательных функций. Тем не менее: добавлена ​​более совместимая версия поворота и обновлена ​​рабочий пример.

S-Man 19.09.2018 10:48

и как мне это сделать?

Heiko O 19.09.2018 12:25

@HeikoO, если это помогло, не забудьте также проголосовать (рядом с зеленым крючком принятия)

S-Man 22.12.2018 21:58

Другие вопросы по теме