powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите составить запрос
22 сообщений из 22, страница 1 из 1
Помогите составить запрос
    #39015345
vitalmar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, имеем две базы:
mysql> select * from name;
+----+-------+
| id | fio |
+----+-------+
| 1 | test1 |
| 2 | test2 |
| 3 | test3 |
+----+-------+
3 rows in set (0.04 sec)

mysql> select * from count;
+----+------+------+------------+---------+
| id | num | sum | date | name_id |
+----+------+------+------------+---------+
| 1 | 1 | 10 | 2015-07-21 | 3 |
| 2 | 1 | 100 | 2015-07-21 | 1 |
| 3 | 1 | 200 | 2015-07-21 | 2 |
| 4 | 2 | 50 | 2015-07-21 | 1 |
| 5 | 3 | 230 | 2015-07-21 | 1 |
| 6 | 2 | 220 | 2015-07-21 | 2 |
+----+------+------+------------+---------+
6 rows in set (0.00 sec)

На выходе хотелось бы получить что-то вроде такой таблицы:
+------+------+------+------+
| fio | 1 | 2 | 3 |
+------+------+------+------+
|test1 | 100 | 50 | 230 |
|test2 | 200 | 220 | |
|test3 | 10 | 200 | |
+-----+-------+------+------+
где fio определяется по name_id, а цифры в шапке это значение num.
Пока остановился на таком запросе:
Код: plsql
1.
SELECT num, SUM, DATE, fio AS f FROM `count` JOIN `info` ON COUNT.fio_id = info.id GROUP BY num
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39015775
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MySQL не знает про PIVOT. Эмулировать пачкой джойнов либо делать через ХП.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39015916
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaMySQL не знает про PIVOT. Эмулировать пачкой джойнов либо делать через ХП.да ладно...

Нет, конечно, команды pivot нету. Но ведь и команда эта не более чем упрощенная запись для group by с кучей case
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39015969
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007команды pivot нету. Но ведь и команда эта не более чем упрощенная запись для group by с кучей case
Ну вот только ерунды говорить не надо, да... скажи наоборот - ещё более или менее будет на правду похоже.
Какая бы ни куча кейсов - она фиксирована, а структура выходного набора детерминирована. А у пивота структура выходного набора динамическая, и зависит она от исходных данных.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39015995
vitalmar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
select fio, sum(if(num=1,sum,'')) as n1, sum(if(num=2,sum,'')) as n2, sum(if(num=3,sum,'')) as n3 from count left join name on count.name_id = name.id group by fio


Данный запрос выводит :
Код: plaintext
1.
2.
3.
4.
5.
6.
+-------+------+------+------+
| fio   | n1   | n2   | n3   |
+-------+------+------+------+
| test1 |  100 |   50 |  230 |
| test2 |  200 |  220 |    0 |
| test3 |   10 |    0 |    0 |
+-------+------+------+------+
Т.е. если знать количество num, то можно и так оставить.
Но теперь остается вопрос с датой, если добавлять в sum(if(num=1,sum, date )), то суммируется дата и значение sum.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39016015
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что с датой? У тебя в примере она в выходной набор вообще не попадает...
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39016031
vitalmar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaА что с датой? У тебя в примере она в выходной набор вообще не попадает...
Неправильно сформулировал суть вопроса, дата нужна.
И вообще суть такова - есть группа вкладчиков, есть фонд, нужна таблица с информацией кто(fio), сколько раз(num), какую сумму(sum) и когда(date) внес.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39016058
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinaу пивота структура выходного набора динамическая, и зависит она от исходных данных.а можно пример? Без prepared?
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39016059
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использование операторов PIVOT и UNPIVOT https://technet.microsoft.com/ru-ru/library/ms177410(v=sql.105).aspx Синтаксис оператора PIVOT является более простым и понятным, чем синтаксис, который может выполнить то же действие с помощью последовательности инструкций SELECT...CASE.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39016061
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitalmarНа выходе хотелось бы получить что-то вроде такой таблицы:
fio 1 2 3 test1 100 50 230 test2 200 220 test3 10 200
где fio определяется по name_id, а цифры в шапке это значение num.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select n.fio, g.`1`, g.`2`, g.`3`
from(
  select name_id
  , max(if(num=1,c.`sum`,null)) `1`
  , max(if(num=2,c.`sum`,null)) `2`
  , max(if(num=3,c.`sum`,null)) `3`
  from `count` c
  group by name_id
  )g
join `name` n on n.id=g.name_id
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39016065
vitalmar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select n.fio, g.`1`, g.`2`, g.`3`
from(
  select name_id
  , max(if(num=1,c.`sum`,null)) `1`
  , max(if(num=2,c.`sum`,null)) `2`
  , max(if(num=3,c.`sum`,null)) `3`
  from `count` c
  group by name_id
  )g
join `name` n on n.id=g.name_id



Спасибо за вариант, но чем он отличается от моего кроме max?
И кроме суммы мне необходимо выводить дату...
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39016067
vitalmar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По итогу получилось так:
Код: plsql
1.
2.
3.
4.
5.
6.
select fio, 
concat_ws(' / ',max(if(num=1,`sum`,'')), max(if(num=1,`date`,''))) as n1,
concat_ws(' / ',max(if(num=2,`sum`,'')), max(if(num=2,`date`,''))) as n2,
concat_ws(' / ' ,max(if(num=3,`sum`,'')), max(if(num=3,`date`,''))) as n3
 from count left join name on count.name_id = name.id
group by fio



Код: plaintext
1.
2.
3.
4.
5.
6.
+-------+------------------+------------------+------------------+
| fio   | n1               | n2               | n3               |
+-------+------------------+------------------+------------------+
| test1 | 100 / 2015-07-21 | 50 / 2015-07-08  | 230 / 2015-07-21 |
| test2 | 200 / 2015-07-21 | 220 / 2015-07-21 |  /               |
| test3 | 10 / 2015-07-05  |  /               |  /               |
+-------+------------------+------------------+------------------+

Осталось придумать вариант, где точное кол-во num не известно и может динамически меняться в сторону увеличения...
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39016085
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitalmarОсталось придумать вариант, где точное кол-во num не известно и может динамически меняться в сторону увеличения...это называется динамический pivot

В строке формируется запрос с явным перечислением уникальных значений поля (в итоге строка будет содержать этот ваш запрос, но для всех значений), а потом выполняется через PREPARED.

Но на самом деле этим удобнее заниматься на стороне клиента.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39016086
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaCygapb-007команды pivot нету. Но ведь и команда эта не более чем упрощенная запись для group by с кучей case
Ну вот только ерунды говорить не надо, да... скажи наоборот - ещё более или менее будет на правду похоже.
Какая бы ни куча кейсов - она фиксирована, а структура выходного набора детерминирована. А у пивота структура выходного набора динамическая, и зависит она от исходных данных.

смотря в какой субд. в оракле например структура набора фиксирована.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39016087
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivAkinaпропущено...

Ну вот только ерунды говорить не надо, да... скажи наоборот - ещё более или менее будет на правду похоже.
Какая бы ни куча кейсов - она фиксирована, а структура выходного набора детерминирована. А у пивота структура выходного набора динамическая, и зависит она от исходных данных.

смотря в какой субд. в оракле например структура набора фиксирована.О, может быть, вы сможете привести пример субд с динамическим пивотом без ухищрений с DSQL?

Имею в виду реляционные субд, конечно же.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39016196
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitalmarПо итогу получилось так:
Будет работать только при условии, что в исходных данных пары (num, name_id) уникальны.
vitalmarОсталось придумать вариант, где точное кол-во num не известно и может динамически меняться в сторону увеличения...
Prepared statement без вариантов.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39016199
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007а можно пример? Без prepared?
Пример чего? PIVOT в исполнении MySQL? Так уже ж сказано - не знает.
Cygapb-007 Использование операторов PIVOT и UNPIVOT https://technet.microsoft.com/ru-ru/library/ms177410(v=sql.105).aspx Синтаксис оператора PIVOT является более простым и понятным, чем синтаксис, который может выполнить то же действие с помощью последовательности инструкций SELECT...CASE.
Из этого следует, что конструкцию с кейсами можно заменить пивотом. Но ни в коем случае не следует, что пивот можно заменить пачкой кейсов. Ты только подтверждаешь сказанное мной.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39016265
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaCygapb-007а можно пример? Без prepared?
Пример чего? PIVOT в исполнении MySQL? Так уже ж сказано - не знает.
Cygapb-007 Использование операторов PIVOT и UNPIVOT пропущено...

Из этого следует, что конструкцию с кейсами можно заменить пивотом. Но ни в коем случае не следует , что пивот можно заменить пачкой кейсов. Ты только подтверждаешь сказанное мной.Нууу... как же не следует? :(Синтаксис оператора PIVOT является более простым и понятным, чем синтаксис, который может выполнить то же действие с помощью последовательности инструкций SELECT...CASE .
Если б пивот умел сам столбцы формировать, он был бы кубом :)
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39017169
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007, если список значений count.num заранее неизвестен, исходная задача всё равно легко решается пивотом. Если ты так убеждён в своей правоте, покажи, как реализовать исходную задачу в этих условиях на кейсах без динамического SQL.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39018065
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaCygapb-007, если список значений count.num заранее неизвестен, исходная задача всё равно легко решается пивотом . Если ты так убеждён в своей правоте, покажи, как реализовать исходную задачу в этих условиях на кейсах без динамического SQL.я уже в котором посте подряд безрезультатно пытаюсь получить пример кода с пивотом, решающим эту проблему, в любой субд, в которой есть пивот.
ПРИМЕР легкого решения - В СТУДИЮ!

Для неизвестного заранее списка значений вариантов всего два: DSQL или обработка данных в клиенте, причем второе более предпочтительно.

Что касается 17934723
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select n.fio, g.*
from(
  select name_id
  , max(iif(num=1,c.sum,null)) n1
  , max(iif(num=2,c.sum,null)) n2
  , max(iif(num=3,c.sum,null)) n3
  from count c
  group by name_id
  )g
join name n on n.id=g.name_id

то в MS SQL это можно записать так:
Код: sql
1.
2.
3.
4.
select n.fio,p.[1]n1,p.[2]n2,p.[3]n3 
from count c
pivot(max(sum) for num in ([1],[2],[3]))p
join name n on n.id=p.name_id

и это конечно же проще для понимания, но - динамики нет ровно настолько, насколько ее нет и в case-варианте
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39018651
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007ПРИМЕР легкого решения - В СТУДИЮ
Перекрёстный запрос в MS Access.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #39018794
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaCygapb-007ПРИМЕР легкого решения - В СТУДИЮ
Перекрёстный запрос в MS Access.Ну так это не пивот... Это сводная таблица, то есть обработка данных на стороне клиента
Access совмещает в себе серверную и клиентскую части, поэтому в нем не заметна такая подмена понятий.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите составить запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]