|
Запрос на объединение двух таблиц (Акт сверки)
|
|||
---|---|---|---|
#18+
Добрый день. С некоторых пор решил перевести свою задачу на SQL. Простые отчеты/запросы уже получаются. Возникла проблема с "Актом сверки". Создается по 4 таблицам, но можно упростить для понимания до 2 таблиц: zim.ttn1 - накладные по отгруженному товару (Дата отгрузки, Номер накладной, Сумма) zim.pay1 - поступившие платежи (Дата платежа, Номер платежки, Сумма платежа) При помощи генератора создаю две таблички Код: 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. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54.
Создал два запроса, первый выводит инфу по отгрузке, другой по платежам, объединил их в одну таблицу через UNION ALL. Первая колонка - Год/Месяц, для последующего объединения/сортировки, последняя не нужна, но без нее GROUP не будет работать. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Результат следующий: Не совсем разобрался с картинками, прикрепил к вопросу. Результат есть, но можно лучше. Надо платежи (значения в 5,6,7 колонках) поднять вверх, к началу соответствующего месяца, чтобы было меньше строк в отчете. За первый месяц должно быть 8 строчек (а не 11), за второй - 10 строчек (а не 12). То-есть первые строчки должны быть: 2018012018-01-02 93912322018-01-038592426822018012018-01-05133045272018-01-17832621752 Да, вообще-то я использую MS SQL, но дома стоит Postgre, поэтому привожу на Postgre. Скажите пожалуйста, куда копать? Буду благодарен за любой совет ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2018, 23:52 |
|
Запрос на объединение двух таблиц (Акт сверки)
|
|||
---|---|---|---|
#18+
Tsimfer, Как в MS SQL не скажу. В PostreSQL делаем также два подзапроса. В каждом подзапросе дополнительное поле с нумерацией последовательности операций внутри месяца. Затем, подзапросы соединяем не по UNION, а через FULL JOIN по месяцу и номеру последовательности. Нумерацию делаем двумя вариантами: - Оконный row_number() OVER (PARTITION BY Extract(year from h.dat), Extract(month from h.dat) ORDER BY h.dat) - Когда оконных функций не было, использовали (костыль) функцию, которая создавала временные сиквенсы CREATE TEMP SEQUENCE для каждого месяца в процессе отбора записей ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2018, 11:15 |
|
Запрос на объединение двух таблиц (Акт сверки)
|
|||
---|---|---|---|
#18+
sereginseregin, Спасибо, буду пробовать. Да, а мне сказали, что MS SQL и Postgres совместимы, а тут читаю, ну "все не по нашему" ! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2018, 12:50 |
|
Запрос на объединение двух таблиц (Акт сверки)
|
|||
---|---|---|---|
#18+
Tsimfer, А что есть в MSSQL, чего вам не хватает для решения данной задачи?.. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2018, 13:31 |
|
Запрос на объединение двух таблиц (Акт сверки)
|
|||
---|---|---|---|
#18+
sereginseregin, Еще раз благодарю, у меня все получилось! Запрос следующий Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Результат прикреплен снизу. vyegorov, я так понимаю, в MS SQL нет row_number. Завтра буду читать форум, искать аналог, точнее уже нашел топик, буду разбираться ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2018, 21:35 |
|
Запрос на объединение двух таблиц (Акт сверки)
|
|||
---|---|---|---|
#18+
Tsimferкуда копать? Буду благодарен за любой совет хм, тёзка, фома неверующий, говорил же - "см. оконные функции..." ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2018, 11:51 |
|
Запрос на объединение двух таблиц (Акт сверки)
|
|||
---|---|---|---|
#18+
cnfhbxjr, Да, ты прав оказался Вариант для MS SQL Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Результат внизу. Конечно в итоговый репорт в колонки m1 и num1 надо вместо NULL добавить значения из m2 и num2, и отсортировать. Но это уже в самом отчете можно сделать. Всем спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2018, 15:00 |
|
Запрос на объединение двух таблиц (Акт сверки)
|
|||
---|---|---|---|
#18+
Tsimfer, "неправильно это", если была идея ВСЁ на сервере, значит надо до конца вгрызаться.. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2018, 16:48 |
|
Запрос на объединение двух таблиц (Акт сверки)
|
|||
---|---|---|---|
#18+
Tsimfer, Конечно в итоговый репорт в колонки m1 и num1 надо вместо NULL добавить значения из m2 и Есть магическая функция coalesce для таких задач: coalesce(s.m1, t.m2), coalesce(s.num1, t.num2) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2018, 04:30 |
|
Запрос на объединение двух таблиц (Акт сверки)
|
|||
---|---|---|---|
#18+
Maxim Boguk, + Тёзка, как говорит молодежь - круто, это настоящий Динозавр PG тебе подсказал, цени.. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2018, 19:09 |
|
Запрос на объединение двух таблиц (Акт сверки)
|
|||
---|---|---|---|
#18+
Maxim Boguk, спасибо, буду пробовать... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2018, 13:20 |
|
Запрос на объединение двух таблиц (Акт сверки)
|
|||
---|---|---|---|
#18+
cnfhbxjr, тут еще один ляп увидел, см. в последней таблице строки 11-12, колонка DOC2. По хорошему, два платежа за один день надо бы отсортировать по возрастанию, а ORDER BY тут уже не прокатит. Да и накладных может быть несколько в один день. Придется сливать селекты во временные таблицы. Примерно так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
В результате платежи за 2018-02-19 стоят как надо (см. строки 16-17). Да, не думал, что маленький "Акт сверки" так разрастется. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2018, 15:40 |
|
Запрос на объединение двух таблиц (Акт сверки)
|
|||
---|---|---|---|
#18+
Tsimfercnfhbxjr, тут еще один ляп увидел, см. в последней таблице строки 11-12, колонка DOC2. По хорошему, два платежа за один день надо бы отсортировать по возрастанию, а ORDER BY тут уже не прокатит. Да и накладных может быть несколько в один день. Придется сливать селекты во временные таблицы. вероятно что не надо этого, ты "погорячился" из-за фразы "все на сервере...") - если результат запроса потом все равно будешь в своей среде считывать и писать в свою базу... - так и считываешь записи в любой последовательности/сортировке из результата запроса, а потом при записи в твою итоговую базу или врем.таблицу уже все сразу и построится как надо по ключам для бровза/репорта или я что-то не так понял? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2018, 22:35 |
|
|
start [/forum/topic.php?fid=53&msg=39612965&tid=1995899]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 285ms |
total: | 408ms |
0 / 0 |