|
Сводная таблица
|
|||
---|---|---|---|
#18+
Всем доброго дня, друзья. Я пока ещё нуб в sql запросах, прошу помочь или наставить на путь истинный. Написал запрос SELECT to_char(cc.date, 'YYYY-MM'), ca.company, sum(cc.total_with_vat), cc.account, cc.service FROM cc left join ca on cc.account = ca.account where cc.account like '200%' and cc.service ='IP' and ca.company like '%Новосибирск%' group by to_char(cc.date, 'YYYY-MM'), cc.account, cc.service, ca.company Всё это выгружается в формате: 2016-01|Новосибирск|300|1|IP 2016-01|Новосибирск|500|2|IP .. |Новосибирск|800|3|IP Мне нужно эти данные выгрузить в эксель, проблема в том, чтобы выгрузить историю, необходимо выгружать около 10 раз, используя limit и offset, чтобы по количеству строк влазило на лист экселя как можно сделать так, чтобы таблица выгружалась в формате, где даты будут в стобцах, то есть: 2016-01|2016-02 и т.д., а в строках соответственно остальные показатели, таким образом можно всё выгрузить за один запрос. Почитал в интернете инфу, всё написано достаточно сложно для моего восприятия, поскольку я пока что не знаю многих тонкостей. Если есть у кого свободные 10-15 минут, уделите время или киньте ссылок, где это более менее доступным языком описано (именно на базе postgresql) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 08:03 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
1.А выгрузить один раз, а потом уже в EXELe разбить по страницам? 2. пивот. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 08:10 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
o.makarov, в общем случае - простых путей нет. в частных случаях - можно использовать PIVOT, либо его "самодельные" аналоги через CASE и группировку. Примитивные и интуитивно-понятные вариант реализации можно посмотреть тут , или тут . не совсем по PostgreSQL, но смысл вполне себе ясен... ;) Если число столбцов заведомо неизвестно, то смотреть в сторону динамического запроса... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 08:13 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
982183, поясните, если не сложно, я выгружаю через pg_admin в csv, потом когда открываю файл через эксель, он пишет, что данные обрезаны из-за того, что строк не хватает Вообще конечно хочу научиться в формате сводной делать, но пока такой вариант тоже подойдёт ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 08:15 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
Щукина Анна, спасибо, обязательно почитаю) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 08:16 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
надо крупно написать на форуме: ПОКАЖИТЕ ИСХОДНЫЕ ТАБЛИЦЫ И ЖЕЛАЕМЫЙ РЕЗУЛЬТАТ только тогда вам смогут помочь превратили приличное место в форум телепатов, тьфу ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 11:36 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
tip78, запрос: SELECT to_char(cc.date, 'YYYY-MM'), ca.company, sum(cc.total_with_vat), cc.account, cc.service FROM cc left join ca on cc.account = ca.account where cc.account like '200%' and cc.service ='IP' and ca.company like '%Новосибирск%' group by to_char(cc.date, 'YYYY-MM'), cc.account, cc.service, ca.company Что выгружает: to_char base_company sum account_number service2016-01 Сибирские Сети Новосибирск 300 2E+12 IP2016-01 Сибирские Сети Новосибирск 300 2E+12 IP2016-01 Сибирские Сети Новосибирск 635 2E+12 IP Что нужно: base_company account_number 2016-01 2016-02 2016-03 2016-04 2016-05 2016-06 2016-07 2016-08 2016-09 2016-10 2016-11Сибирские Сети Новосибирск 2E+12 300 300 300 300 300 300 300 300 300 300 300Сибирские Сети Новосибирск 2E+12 45039 8194 3175 635 635Сибирские Сети Новосибирск 2E+12 300 300 300 300 300 300 300 300 300 300 300 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 13:38 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
tip78, запрос: SELECT to_char(cc.date, 'YYYY-MM'), ca.company, sum(cc.total_with_vat), cc.account, cc.service FROM cc left join ca on cc.account = ca.account where cc.account like '200%' and cc.service ='IP' and ca.company like '%Новосибирск%' group by to_char(cc.date, 'YYYY-MM'), cc.account, cc.service, ca.company Что выгружает: to_char base_company sum account_number service2016-01 Новосибирск 300 2E+12 IP2016-01 Новосибирск 300 2E+12 IP2016-01 Новосибирск 635 2E+12 IP Что нужно: base_company account_number 2016-01 2016-02 2016-03 2016-04 2016-05 2016-06 2016-07 2016-08 2016-09 2016-10 2016-11Новосибирск 2E+12 300 300 300 300 300 300 300 300 300 300 300Новосибирск 2E+12 45039 8194 3175 635 635 Новосибирск 2E+12 300 300 300 300 300 300 300 300 300 300 300 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 13:41 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
o.makarov982183, поясните, если не сложно, я выгружаю через pg_admin в csv, потом когда открываю файл через эксель, он пишет, что данные обрезаны из-за того, что строк не хватает Вообще конечно хочу научиться в формате сводной делать, но пока такой вариант тоже подойдёт Какая версия екселя? Сколько строк в оькрываемом буфере? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 14:42 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
o.makarov, таблицы исходные непонятно же нихрена, что за "cc.account like '200%'", а в результатах его НЕТ почему в таблице и в запросе разные поля, и почему такой GROUP BY, можно же было по ca.account группировать ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 16:48 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
tip78, ну смотрите - есть список данных: дата, номер, сумма, регион Эти данные хранятся в базе в таком формате, что на одну дату (и уж тем более на один месяц) приходится несколько сумм по номерам. Мне нужно, чтобы на один месяц был один номер с общей суммой, поэтому я делаю сумм и группирую по дате, иначе выгрузиться намного больший массив по строкам. Но поскольку этих номеров очень много, даже при учёте группировке, в идеале нужно, чтобы дата была в столбцах (аналогично сводной таблице), а поскольку я sql только вот начал изучать самостоятельно, я очень многого не знаю. В скриптах, которые я находил в интернете, попросту не могу разобраться, не хватает мне пока ещё знаний и тонкостей синтаксиса. Во вложении скрин запроса и таблицы (на like можете не обращать внимание, это вывод номеров, которые мне нужны, этот оператор особой роли не играет) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2018, 05:21 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
982183, Эксель 2016, в итоговом csv файле где-то 5-6 млн строк ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2018, 05:22 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
tip78, Если группировать по аккаунтам, то будет один аккаунт - одна сумма в общем за все периоды, а мне нужна один аккаунт - одна сумма на каждый месяц (то есть сумма за январь, февраль, март и т.д. по каждому аккаунту) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2018, 05:26 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
Сводную таблицу, лучше делать в клиентской части, возможно в том же экселе или еще чем. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2018, 05:49 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
o.makarov в итоговом csv файле где-то 5-6 млн строк Теперь понятно. Может легче будет сменить инструмент? EXCEL явно не то, на чем обрабатываются такие объемы. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2018, 05:50 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
982183o.makarov в итоговом csv файле где-то 5-6 млн строк Теперь понятно. Может легче будет сменить инструмент? EXCEL явно не то, на чем обрабатываются такие объемы. Если к Excel, прицепить этот CSV в качестве источника данных, то при построении сводной таблицы, он будет использовать все данные (если результирующих строк будет больше 1М+, то он результат обрежет, но вроде предупреждение выдаст, что не может все отобразить), не скажу что это ему легко дастся, но работать с ними, он вполне в состоянии. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2018, 05:57 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
o.makarovtip78, Если группировать по аккаунтам, то будет один аккаунт - одна сумма в общем за все периоды, а мне нужна один аккаунт - одна сумма на каждый месяц (то есть сумма за январь, февраль, март и т.д. по каждому аккаунту) Группировать тебе надо по акаунту, а периоды вывести или через PIVOT или через CASE Примерно так: SELECT CASE WHEN to_char(cc.date, 'YYYY-MM'), ="2018-1" THEN sum(cc.total_with_vat) END as 2018-1, CASE WHEN to_char(cc.date, 'YYYY-MM'), ="2018-2" THEN sum(cc.total_with_vat) END as 2018-2, ,,, CASE WHEN to_char(cc.date, 'YYYY-MM'), ="2018-12" THEN sum(cc.total_with_vat) END as 2018-12, синтаксис на PostgreSQL точно на подскажу ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2018, 06:03 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
angel_zar, Насчёт экселя, конечно проще, но мне в принципе и самому интересно, как можно строить сводные в самом SQLе По поводу прицепить csv файл в качестве источника - интересный вариант, строк будет меньше миллиона, не знал, что так можно. Спасибо, попробую) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2018, 06:05 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
angel_zarЕсли к Excel, прицепить этот CSV в качестве источника данных, то при построении сводной таблицы, он будет использовать все данные Не знал. Надо попробовать. Но явно ему такие извращения не нужны. Идея переписать запрос правильная. Направление с PIVOT либо CASE Анна ему подсказала. Осталось немного напрячься и сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2018, 06:06 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
982183, Не понимаю пока что - что это и что будет в результате, но спасибо, я попробую сейчас с этим разобраться) От экселя никуда не уйти, да и куда уйти, я кроме экселя и гугл таблиц похожих интерфейсов не встречал, а конечные пользователи, для которых формируется отчёт - работают в экселе ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2018, 06:09 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
982183SELECT CASE WHEN to_char(cc.date, 'YYYY-MM'), ="2018-1" THEN sum(cc.total_with_vat) END as 2018-1, CASE WHEN to_char(cc.date, 'YYYY-MM'), ="2018-2" THEN sum(cc.total_with_vat) END as 2018-2, ,,, CASE WHEN to_char(cc.date, 'YYYY-MM'), ="2018-12" THEN sum(cc.total_with_vat) END as 2018-12, вру Примерно так: SELECT sum(CASE WHEN to_char(cc.date, 'YYYY-MM'), ="2018-1" THEN cc.total_with_vat END) as "2018-1", sum(CASE WHEN to_char(cc.date, 'YYYY-MM'), ="2018-2" THEN cc.total_with_vat END) as "2018-2", ,,, sum(CASE WHEN to_char(cc.date, 'YYYY-MM'), ="2018-12" THEN cc.total_with_vat END) as "2018-12", ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2018, 06:10 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
982183, Подскажите, пожалуйста, а после того, как все CASE заданы, далее я просто дописываю в SELECT то что мне нужно? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2018, 06:12 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
Да, убираешь из группировки to_char(cc.date, 'YYYY-MM') и вставляешь в SELECT то же самое через CASE ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2018, 07:25 |
|
Сводная таблица
|
|||
---|---|---|---|
#18+
982183, таким образом должно выглядеть? Оставшиеся колонки (сервис, компания и номер) просто дописываются или тоже через CASE? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2018, 08:25 |
|
|
start [/forum/topic.php?fid=53&msg=39654639&tid=1995741]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
others: | 341ms |
total: | 514ms |
0 / 0 |