|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
В таблице Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
хранятся данные на 1-е число каждого месяца по каждому контрагенту. Нужно выбрать значения трех полей (h_sum_bill, h_sum_change, h_sum_get) за период в несколько месяцев таким образом: h_sum_bill, h_sum_change взять из текущего месяца периода, а h_sum_get из следующего. Если след.месяца периода в БД нет, вернуть в h_sum_get NULL. Подскажите, пожалуйста, какой запрос написать? Пробовал JOIN и двойной подзапрос, но что-то не то выходит... Создал фидл: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=04df9cb36642125d36979e6ed4c66a17 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2019, 15:24 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
А эталонный ответ-то где? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2019, 16:12 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
Посмотри Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2019, 16:15 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
AkinaА эталонный ответ-то где? Для тех данных, что в фидле и периода = period BETWEEN '2018-10-01' AND '2018-12-01' для id_contragent=1 должно быть: h_sum_billh_sum_changeh_sum_get500033350192225020NULL ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2019, 16:28 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
AkinaПосмотри Не подходит. Может не ясно выразился, но надо по одному контрагенту и за заданный период, а тут по все и за все время. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2019, 16:33 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
Ну добавь WHERE по первой копии таблицы, какие сложности-то? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2019, 16:44 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
AkinaНу добавь WHERE по первой копии таблицы, какие сложности-то? Никаких, это я ступил :) Как обычно, спасибо за решение! Такой explain получился, вроде норм? idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra1SIMPLEdreffk_contr;i_perfk_contr5const1223.59Using where1SIMPLEdnreffk_contrfk_contr5const12100.00Using where ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2019, 16:50 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
LiYingТакой explain получился, вроде норм?Не очень. Лучше, конечно, избавиться от скана по правой таблице. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2019, 16:58 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
AkinaLiYingТакой explain получился, вроде норм?Не очень. Лучше, конечно, избавиться от скана по правой таблице. Ммм... как? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2019, 17:00 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
Преобразовать Код: sql 1.
в формат Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2019, 19:07 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
Akina, См. 3 запроса на примере - https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=7597c80a4980b895b31317e83cef6478 После такого преобразования (запрос №3) получается мой 1-й запрос только без BETWEEN, 2-й - правильный. Или что подразумевалось под (выражение 1 от d.period) и (выражение 2 от d.period) ? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2019, 08:22 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7.
fiddle Впрочем, чтобы увидеть разницу (если её вообще можно увидеть), нужно обрабатывать ну очень большой объём данных... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2019, 10:21 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
Проверил на реальной БД, explain получился одинаковый с предыдущим: idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra1SIMPLEdreffk_contr;i_perfk_contr5const1223.59Using where1SIMPLEdnreffk_contr;i_perfk_contr5const12100.00Using where Записей в таблице data = 167805 и каждый месяц величивается на 20+ тыс. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2019, 10:53 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
LiYingexplain получился одинаковый с предыдущимУгу. Только расчёт упростится. Но это крохи по сравнению с доступом к исходным данным. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2019, 13:41 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2019, 13:52 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
Задача усложнилась и новый вопрос в продолжение темы... Теперь идентичные данные из одного запроса Код: sql 1. 2. 3. 4. 5. 6. 7.
нужно просуммировать с данными из другого аналогичного (используется другая таблица) Код: sql 1. 2. 3. 4. 5. 6. 7.
Т.е. на выходе получить (d.h_sum_bill + d2.h_sum_bill), (d.h_sum_change + d2.h_sum_change), (dn.h_sum_get + dn2.h_sum_get) для одного period . Параметры в WHERE запросов одинаковы. Но количество записей в этих двух выборках может отличаться, к примеру во 2-м запросе может отсутствовать d2.period соответствующий d.period. Возможные варианты: 1) есть данные в data и есть данные в data_nu 2) есть данные в data и нет данных в data_nu 3) нет данных в data и есть данные в data_nu Собственно вопрос - можно ли объединить эти два запроса в один, чтобы получить желаемое? Или проще получать данные двумя запросами и уже программно суммировать соответствующие поля? Буду благодарен за помощь! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 10:33 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
Почти решил так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
но проблема в том, что если нет данных в таблице t1 , то в результате имеем пустую выборку. Или пропуск строки из t2 , если соответствущий ему период t1.period = NULL. Как это победить? И попутно, что правильней использовать: COALESCE или IFNULL при суммировании? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 13:13 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
LiYing Возможные варианты: 1) есть данные в data и есть данные в data_nu 2) есть данные в data и нет данных в data_nu 3) нет данных в data и есть данные в data_nu Собственно вопрос - можно ли объединить эти два запроса в один, чтобы получить желаемое? Можно. Но придётся получать полный список периодов отдельным подзапросом - MySQL не поддерживает FULL JOIN. LiYing проблема в том, что Код: sql 1. 2. 3.
LiYing что правильней использовать: COALESCE или IFNULL Правильно - забыть про существование IFNULL навсегда. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 13:33 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
Akina, Вроде мысль уловил, но при выполнении даже простого запроса: Код: 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.
получаю ошибку > 1109 - Unknown table 't1' in field list > Time: 0,002s без указания в какой строке. Где косячу? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 14:24 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
LiYing без указания в какой строке. LiYing Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 17:03 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
del ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 17:22 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
LiYing Почему t1 неизвестна в t3? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 17:22 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
miksoft, как всегда самое очевидное оказалось пропущено из внимания... уже когда нажал кнопку опубликовать пост понял свой косяк :) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 17:25 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
Akina, только чтобы быть уверенным, что правильно понял мысль - так должно быть? Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2020, 11:43 |
|
Выбрать из 1й таблицы, но за разный период
|
|||
---|---|---|---|
#18+
LiYing Код: sql 1.
Код: sql 1.
Возможно, будет чуть быстрее. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2020, 12:10 |
|
|
start [/forum/topic.php?fid=47&msg=39879454&tid=1828645]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
135ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 302ms |
total: | 538ms |
0 / 0 |