SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.10.2014 09:56:57

bugagawenka
Участник
Зарегистрирован: 09.10.2014
Сообщений: 10

Задачка: Выбор по 2 периодам(предыдущий, текущий) одного контракта

Доброго времени суток! Прошу вашей помощи со сложным для меня запросом в Mysql.
Необходимо заполнить таблицу разными данными за периоды.

Исходная таблица выглядит так:

id | nomer | sostoyanienadatu | summa |
------------------------------------------
1  |номер 1| 2014-09-15       | 100   |
2  |номер 2| 2014-10-10       | 200   |
3  |номер 1| 2014-10-05       | 300   |
4  |номер 3| 2014-10-11       | 400   |
5  |номер 4| 2014-09-06       | 500   |

к примеру:
prmysyac - 2014-09
tekywiymesiac - 2014-10

Должно получиться вот так:

nomer   | prmysyac | tekywiymesiac |
------------------------------------
номер 1 | 100         | 300                |
номер 2 |               | 200                |
номер 3 |               | 400                |
номер 4 | 500         |                      |

то, что освоил и может пригодиться(на мой взгляд):
данные про текущий и прошлый период в sql передаю из php переменными и заполняю так, что получается вот такой запрос:

SELECT `nomer`,`zakazchik`, FROM database.table WHERE sostoyanienadatu LIKE '2014-09%';

использую вот такой запрос для выявления последнего контракта:
SELECT * FROM database.table WHERE (nomer,sostoyanienadatu) IN (SELECT nomer, MAX(sostoyanienadatu) FROM database.table GROUP BY nomer);


Буду безмерно благодарен за помощь.

Неактивен

 

#2 09.10.2014 12:40:06

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Задачка: Выбор по 2 периодам(предыдущий, текущий) одного контракта


select t.nomer, t1.`summa` prmysyac , t2.`summa` tekywiymesiac from `таблица` t left join
(select id, `summa` from `таблица` where month(sostoyanienadatu)=9 ) t1 using(id) left join
(select id, `summa` from `таблица` where month(sostoyanienadatu)=10 ) t2 using (id);


Если sostoyanienadatu у вас строка, то вместо
month(sostoyanienadatu)=9
используйте как раньше
sostoyanienadatu LIKE '2014-09%'
но лучше пересмотрите использование типов.

Неактивен

 

#3 09.10.2014 13:09:44

bugagawenka
Участник
Зарегистрирован: 09.10.2014
Сообщений: 10

Re: Задачка: Выбор по 2 периодам(предыдущий, текущий) одного контракта

Добрый день многоуважаемый vasya! Огромное спасибо за помощь smile

поле sostoyanienadatu - date.
К сожалению сейчас результат отработки скрипта

select t.nomer, t1.`summa` prmysyac , t2.`summa` tekywiymesiac from test.kontr t left join
(select id, `summa` from test.kontr where where month(sostoyanienadatu)=9 ) t1 using(id) left join
(select id, `summa` from test.kontr where where month(sostoyanienadatu)=10 ) t2 using (id);


формирует вот такую таблицу:

nomer   | prmysyac | tekywiymesiac |
------------------------------------------
номер 2 |               | 200               |
номер 1 |               | 300               |
номер 3 |               | 400               |
номер 1 | 100         |                     |
номер 4 | 500         |                     |

Что-то нужно подправить?

Неактивен

 

#4 09.10.2014 15:02:20

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Задачка: Выбор по 2 периодам(предыдущий, текущий) одного контракта

select t.nomer, t1.`summa` prmysyac , t2.`summa` tekywiymesiac from test.kontr t left join
(select nomer, `summa` from test.kontr where where month(sostoyanienadatu)=9 ) t1 using(nomer) left join
(select nomer, `summa` from test.kontr where where month(sostoyanienadatu)=10 ) t2 using (nomer);

Неактивен

 

#5 09.10.2014 15:15:42

bugagawenka
Участник
Зарегистрирован: 09.10.2014
Сообщений: 10

Re: Задачка: Выбор по 2 периодам(предыдущий, текущий) одного контракта

Огромное спасибо за оперативность! Вы мне очень помогли smile Огромное спасибо.

вот этот запрос:

select t.nomer, t1.`summa` prmysyac , t2.`summa` tekywiymesiac from test.kontr t left join
(select nomer, `summa` from test.kontr where month(sostoyanienadatu)=9 ) t1 using(nomer) left join
(select nomer, `summa` from test.kontr where month(sostoyanienadatu)=10 ) t2 using (nomer);


выдает вот такую таблицу:
nomer   | prmysyac | tekywiymesiac |
-------------------------------------------
номер 2 |               | 200                |
номер 1 | 100         | 300                |
номер 1 | 100         | 300                |
номер 3 |               | 400                |
номер 3 | 500         |                      |

Боюсь показаться назойливым, но не подскажите как можно избавиться от задвоения строки "номер 1" ?

Неактивен

 

#6 09.10.2014 15:17:51

bugagawenka
Участник
Зарегистрирован: 09.10.2014
Сообщений: 10

Re: Задачка: Выбор по 2 периодам(предыдущий, текущий) одного контракта

Сам сообразил smile спасибо!

select t.nomer, t1.`summa` prmysyac , t2.`summa` tekywiymesiac from test.kontr t left join
(select nomer, `summa` from test.kontr where month(sostoyanienadatu)=9 ) t1 using(nomer) left join
(select nomer, `summa` from test.kontr where month(sostoyanienadatu)=10 ) t2 using (nomer) GROUP BY nomer;

Неактивен

 

#7 09.10.2014 15:19:18

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Задачка: Выбор по 2 периодам(предыдущий, текущий) одного контракта

select distinct t.nomer, t1.`summa` prmysyac , t2.`summa` tekywiymesiac from test.kontr t left join
(select nomer, `summa` from test.kontr where month(sostoyanienadatu)=9 ) t1 using(nomer) left join
(select nomer, `summa` from test.kontr where month(sostoyanienadatu)=10 ) t2 using (nomer);

Неактивен

 

#8 10.10.2014 15:32:21

bugagawenka
Участник
Зарегистрирован: 09.10.2014
Сообщений: 10

Re: Задачка: Выбор по 2 периодам(предыдущий, текущий) одного контракта

Доброго времени суток!
Скрипт отлично работает, но если в исходную таблицу добавить ещё одну строку:

id | nomer | sostoyanienadatu | summa |
------------------------------------------
1  |номер 1| 2014-09-15       | 100   |
2  |номер 2| 2014-10-10       | 200   |
3  |номер 1| 2014-10-05       | 300   |
4  |номер 3| 2014-10-11       | 400   |
5  |номер 4| 2014-09-06       | 500   |
6  |номер 5| 2014-07-11       | 600   |

то результат отработки скрипта будет вот такой:

nomer   | prmysyac | tekywiymesiac |
-------------------------------------------
номер 1 | 100         | 300                |
номер 2 |               | 200                |
номер 3 |               | 400                |
номер 4 | 500         |                      |
номер 5 |               |                      |

То есть выводится пустая строка. Подскажите как исправить?

Отредактированно bugagawenka (10.10.2014 15:38:28)

Неактивен

 

#9 10.10.2014 23:34:26

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Задачка: Выбор по 2 периодам(предыдущий, текущий) одного контракта

select distinct t.nomer, t1.`summa` prmysyac , t2.`summa` tekywiymesiac from test.kontr t left join
(select nomer, `summa` from test.kontr where month(sostoyanienadatu)=9 ) t1 using(nomer) left join
(select nomer, `summa` from test.kontr where month(sostoyanienadatu)=10 ) t2 using (nomer)
where month(t.sostoyanienadatu) in (9,10);

Неактивен

 

#10 13.10.2014 10:09:37

bugagawenka
Участник
Зарегистрирован: 09.10.2014
Сообщений: 10

Re: Задачка: Выбор по 2 периодам(предыдущий, текущий) одного контракта

Доброго времени суток smile
Премного благодарен! Огромное спасибо smile Всё замечательно работает.
roll

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson