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

Вы заранее знаете, что вам нужны просто 4021 и 4023? Или это будет динамическим, в зависимости от того, сколько различных classid существует в вашей таблице?
привет, будет больше идентификаторов классов, так что да, это должно быть динамически
Не беспокойтесь о форматировании всего этого. Чтобы сохранить пробелы и переводы строк, просто сделайте отступ каждой строки в таблицах / коде четырьмя пробелами. Вы также можете выделить блок и нажать кнопку {} в верхней части редактора. Я отредактировал этот вопрос, чтобы сделать именно это.
Заметил ;-), вот добрый с вашей стороны, цените!
Dynamic Pivot в Postgres совсем не прост. Существует БОЛЬШОЙ напиши на этот вопрос, хотя он проведет вас через ключевое слово crosstab, как его применить и шаги, необходимые для создания чего-то динамического. Это одна из тех вещей, когда вы либо погружаетесь в функции, либо динамически генерируете кросс-таблицу / сводный запрос, а затем выполняете динамически сгенерированный sql.
Как правило, вывод динамической сводной / кросс-таблицы лучше всего передавать на уровень вашего приложения (если он существует). Это то место, где клиентское программное обеспечение для создания отчетов выделяется (например, таблицы, бизнес-объекты (? Я думаю), Excel и т. д.)
спасибо, как бы выглядело статическое решение, скажем, всего с 5 классами. Я использую Pentaho Kettle - именно здесь происходит вся ETL ....
Извините за задержку. Это хороший простой пример статической кросс-таблицы.





демонстрация: 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.
Какую версию вы используете?
мы используем 9.3
Вам действительно следует обновить свою базу данных, поскольку 9.3 больше не поддерживается. И вы упускаете много действительно замечательных функций. Тем не менее: добавлена более совместимая версия поворота и обновлена рабочий пример.
и как мне это сделать?
@HeikoO, если это помогло, не забудьте также проголосовать (рядом с зеленым крючком принятия)
извините, это мой 1-й пост здесь. Пожалуйста, нажмите на ссылку изображения для получения подробной информации. Спасибо