420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518

Сводная таблица

07.12.2016, 14:04. Показов 7638. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Гуру, подскажите!

Есть ли ВООБЩЕ готовый/стандартный механизм для создания сводных таблиц на SQL (и в Postgresql в частности)???

Есть таблица на 3 столбца - покупатель/товар/количество

надо создать таблицу где вверху(название столбцов) идут покупатели (я ТОЧНО знаю что их меньше 100) (на английском без пробелов или в виде кодов "cl_1", cl_100")
а строками идут товары и количество под каждый покупателем....

(иногда выводить пользователю такое проще)

такое делается одной командой в Екселе.
Когда-то (долго думал) придумал как подобное сделать сложной функцией в цикле сгенерировав SQL строку, а потом ее выполнив...

а что-нибудь попроще/логичнее есть???
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.12.2016, 14:04
Ответы с готовыми решениями:

Режимы Сводная таблица и Сводная диаграмма в access 2013
куда делись режимы Сводная таблица и Сводная диаграмма в access 2013? Остались только режимы конструктор и таблица

Сводная таблица
Доброго дня. Подскажите, что нужно сделать, чтобы данные в сводной таблице расположились рядом в соседней колонке, как в исходной таблице,...

Сводная таблица
Здравствуйте. Создал сводную таблицу "Успеваемость класса". Сохранил ее как форму. Выглядит она следующим образом: ...

6
1267 / 980 / 385
Регистрация: 02.09.2012
Сообщений: 3,027
07.12.2016, 14:11
Если я правильно понял ваш вопрос, то нужен этот модуль tablefunc
1
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
07.12.2016, 23:37  [ТС]
Цитата Сообщение от grgdvo Посмотреть сообщение
то нужен этот модуль tablefunc
Когда-то видел его...
вот пример с того сайта:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
CREATE TABLE sales(YEAR INT, MONTH INT, qty INT);
INSERT INTO sales VALUES(2007, 1, 1000);
INSERT INTO sales VALUES(2007, 2, 1500);
INSERT INTO sales VALUES(2007, 7, 500);
INSERT INTO sales VALUES(2007, 11, 1500);
INSERT INTO sales VALUES(2007, 12, 2000);
INSERT INTO sales VALUES(2008, 1, 1000);
 
SELECT * FROM crosstab(
  'select year, month, qty from sales order by 1',
  'select m from generate_series(1,12) m'
) AS (
  YEAR INT,
  "Jan" INT,
  "Feb" INT,
  "Mar" INT,
  "Apr" INT,
  "May" INT,
  "Jun" INT,
  "Jul" INT,
  "Aug" INT,
  "Sep" INT,
  "Oct" INT,
  "Nov" INT,
  "Dec" INT
);
 YEAR | Jan  | Feb  | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov  | DEC
------+------+------+-----+-----+-----+-----+-----+-----+-----+-----+------+------
 2007 | 1000 | 1500 |     |     |     |     | 500 |     |     |     | 1500 | 2000
 2008 | 1000 |      |     |     |     |     |     |     |     |     |      |
(2 ROWS)
Похоже надо ВРУЧНУЮ задавать список имен столбцов... а хотелось бы прямо из таблицы! если появится "13й месяц" в таблице - хотелось бы его АВТОМАТИЧЕСКИ найти и сделать столбцом! Типа из этой таблицы только 3 столбца можно сделать, а из этой 53...
0
1267 / 980 / 385
Регистрация: 02.09.2012
Сообщений: 3,027
08.12.2016, 02:36
Можно нагородить работу с курсорами

SQL
1
2
DROP TABLE IF EXISTS sales;
CREATE TABLE sales(customer text, item text, qty INT);
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
CREATE OR REPLACE FUNCTION mycrosstab(src_table text)
RETURNS refcursor AS
$$
DECLARE
  coldecl text;
  colcur refcursor;
  colrec record;
  cur refcursor;
  src_sql text := 'select item, customer, qty from sales order by 1';
  cat_sql text := 'select distinct customer from sales';
BEGIN
  coldecl := 'as (item text';
  OPEN colcur FOR EXECUTE cat_sql;
  loop
    fetch NEXT FROM colcur INTO colrec;
    exit WHEN NOT found;
    coldecl := coldecl || ', "' || colrec.customer || '" int';
  END loop;
  coldecl := coldecl || ')';
  close colcur;
  --raise notice '%', coldecl; --debug
  
  cur := 'pivot' || src_table;
  OPEN cur FOR EXECUTE 'SELECT * FROM crosstab('''||src_sql||''','''||cat_sql||''')'||coldecl;
  RETURN cur;
END;
$$
LANGUAGE plpgsql;
SQL
1
2
3
4
5
6
7
8
9
10
11
12
INSERT INTO sales VALUES('Иванов', 'хлеб', 1000);
INSERT INTO sales VALUES('Иванов', 'молоко', 2000);
INSERT INTO sales VALUES('Иванов', 'колбаса', 3000);
INSERT INTO sales VALUES('Иванов', 'мясо', 4000);
INSERT INTO sales VALUES('Иванов', 'водка', 5000);
INSERT INTO sales VALUES('Петров', 'ириска', 6000);
INSERT INTO sales VALUES('Петров', 'водка', 7000);
INSERT INTO sales VALUES('Сидоров', 'хлеб', 8000);
INSERT INTO sales VALUES('Сидоров', 'молоко', 9000);
INSERT INTO sales VALUES('Сидоров', 'колбаса', 1000);
INSERT INTO sales VALUES('Сидоров', 'яблоко', 2000);
INSERT INTO sales VALUES('Сидоров', 'мандарин', 3000);
SQL
1
2
SELECT mycrosstab('sales');
fetch ALL FROM "pivotsales";
item text "Иванов" integer "Петров" integer "Сидоров" integer
водка50007000 
ириска 6000 
колбаса3000 1000
мандарин   
молоко2000 9000
мясо4000  
хлеб1000 8000
яблоко  2000

SQL
1
2
3
INSERT INTO sales VALUES('Новичок', 'арбуз', 1000);
INSERT INTO sales VALUES('Новичок', 'яблоко', 2000);
INSERT INTO sales VALUES('Новичок', 'мандарин', 3000);
SQL
1
2
SELECT mycrosstab('sales');
fetch ALL FROM "pivotsales";
item text "Иванов" integer "Петров" integer "Сидоров" integer "Новичок" integer
арбуз   1000
водка50007000  
ириска 6000  
колбаса3000 1000 
мандарин  30003000
молоко2000 9000 
мясо4000   
хлеб1000 8000 
яблоко  20002000

но как к этом отнесется ваш фронтэнд.
По хорошему курсоры бы закрывать надо, либо учитывать, что курсор сам закрывается при завершении транзакции.
1
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
08.12.2016, 02:49  [ТС]
Цитата Сообщение от grgdvo Посмотреть сообщение
Можно нагородить работу с курсорами
Все куда проще... можно создать функцию, которая "сделает всю работу за тебя"...

функция может создать строку, в цикле по запросу(select distinct head_field from...) ее "дозаполнить", а потом выполнить как один запрос и вернуть результа...

Я делал подобное! Параметрами функции идут таблица полей для имен, имя для колонки и поле для значений... на выходе получаю SQL строку с запросом на нужное количество left join и "исправленными" (пробелы убрать или в "f_"+count) названиями полей... долго игрался и "засоряю" систему лишней функцией.

Но вопрос был в "решении из коробки"... вчера знакомому дали задание сделать подобное в BigQuery(google) - тоже вручную 30 join рисовал... думал может "конструкцию" какую стандартную не заметил...
0
1267 / 980 / 385
Регистрация: 02.09.2012
Сообщений: 3,027
08.12.2016, 05:40
Цитата Сообщение от Tester64 Посмотреть сообщение
Но вопрос был в "решении из коробки"
нет, решения из коробки мне не попадались.
вряд ли его в принципе можно ожидать.
- в SQL в принципе не предусмотрена такая возможность. SELECT всегда должен быть однозначным.
- а когда начинаете динамику городить, то нужно думать, как именовать поля, чтобы потом на клиенте срастить выбранные поля-категории. если вернуть из функции через SETOF или TABLE, все равно попросят поименовать поля результата

так что остается либо временная таблица, либо извраты с курсорами
30 джоинов это как-то ну совсем изврат, нельзя такие запросы составлять, уж лучше временная таблица
1
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
08.12.2016, 13:22  [ТС]
Цитата Сообщение от grgdvo Посмотреть сообщение
30 джоинов это как-то ну совсем изврат, нельзя такие запросы составлять, уж лучше временная таблица
BigQuery не поддерживает "временных таблиц", не дает доступа из SQL-query к изменению таблиц, нет пользовательских функций и даже update ограничивает в бетта версии в 500 запросов в сутки! Хелп у них настолько слабый (как и "сообщество") что пробую искать функции сначала в Postgresql, а потом надеяться что подобное есть и у них... пока ТОЛЬКО Join... пока ручками генерим (для тестов) потом на Java генератор запроса писать придется...

...надеялся что найдя что-нибудь "из коробки" в Post... найду подобное и в BQ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.12.2016, 13:22
Помогаю со студенческими работами здесь

Сводная таблица
Формирую сводную таблицу на основе таблицы: |Месяц|№обьекта|Значение| Надо отразить информацию по месяцам. Поэтому поле Месяц...

Сводная таблица
Коллеги, добрый день. Подскажите, пожалуйста. Можно ли в сводную таблицу вставить графу с формулой, которая будет сама...

Сводная таблица
Здравствуйте, ребята! На картинке диаграмма. Пользователь заполняет таблицы work1, work2, work3. Требуется создать сводную таблицу...

Сводная таблица
Здравствуйте! Подскажите пожалуйста. Задание в картинке. Нужно создать отчет по каждому курсу с графическим отображением. Я так понимаю...

Сводная таблица
Здравствуйте, товарищи. Помогите решить задачу. Необходимо сформировать таблицу как на рисунке, где: поле Кол-во на складе заполняется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru