|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
Добрый день. Читал вот эту тему: 10187341 - не помогло, поэтому создаю новую тему. Прикрепляю SQL файл где создается БД, таблица и вставляются данные. Некоторые пояснения. Имеем таблицу тарифов на жилищно-коммунальные услуги. Это фрагмент таблица. На самом деле полей и дат больше, но привожу только ключевые поля/даты. Пояснения к таблице: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Мне нужно получить развернутую таблицу по горизонтали по полю DATA_TR. Сначала все поля с датой 01/12/2016, потом 01/10/2015 и в завершение 01/09/2014. Проблема заключается в том что может быть несколько строк с разными DATA_E и DATA_R. для BD=2 вот такая картина: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Как видно для cod_rizn 1,4,5,7,8,9 есть 2 DATA_E и DATA_R: 21/10/2015, 05/11/2015 и 01/10/2015, 22/10/2015 соответственно. Мне нужно выбрать последние (максимальные) значения. Так же количество значений тоже может быть разное, например для той же BD=2 количество строк (если брать только нужные даты) для 01/12/2016 и 01/10/2015 - 10 строк, а для 01/09/2016 - 6 строк. Пытался сделать так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Но, скорее всего, из-за того что есть несколько строк на 1 значение cod_rizn - результат пустой. Пробовал как в упомянутом сообщении применить LEFT JOIN - результат тот же, НИЧЕГО Что я неправильно делаю и как правильно добавить условие по выбору максимальной даты (DATA_E и DATA_R) из нужной мне DATA_TR? -------------------------- Firebird 3.0.1.32609; IBExpert 2017.2.7.1; Windows 10 32-bit; 4Gb RAM; SSD 512Mb + HDD 1 Tb; Настройки по умолчанию ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2017, 16:09 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
Hello, Akrush! You wrote on 15 февраля 2017 г. 16:21:24: Akrush> Прикрепляю SQL файл где создается БД, таблица и вставляются данные. ты не обижайся, но делать работу вместо тебя никто не будет. здесь подскажут и направят. но делать тебе предстоит самому. по теме: если это отчёт, то делать его нужно средствами построения отчётов. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2017, 16:26 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
Мимопроходящий, Я давно не обижаюсь на то что пишут на форумах. Так сказать у каждого свои "тараканы" в голове. Это не отчет. Ведется работа по слиянию 6 баз в одну. Чтобы правильно слить систему тарифов я хочу видеть 3 "среза": Последняя, действующая - 01/12/2016 год назад - 01/10/2015 и система до изменения законодательства по нормативам - 01/09/2014 Я не прошу решать за меня проблемы. Я прошу указать куда копать. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2017, 16:47 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
akrush, а давай разобьём задачу на две. Сначала получим нужные данные. Потом попробуем перевернуть. Или наоборот. Что касается второй задачи. Поскольку хранение данных в горизонтальном виде противоестественно, то вопрос - количество столбцов заранее известно? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2017, 17:05 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
KreatorXXI, Можно сказать - да. Не считая ключевых полей которые приведены как пример есть еще 16 полей ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2017, 17:16 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
Может подскажите как избавиться от повторений в датах - тогда думаю что "взлетит" ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2017, 17:17 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
Hello, Akrush! You wrote on 15 февраля 2017 г. 17:23:57: Akrush> Может подскажите как избавиться от повторений в датахдля начала сформулируй словами критерии (минимальные и достаточные), по которым та, или иная запись из таблицы попадает в результирующую выборку. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2017, 17:25 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
Мимопроходящий, Нужно отобрать все записи которые data_tr = 01/12/2016 or 01/10/2015 or 01/09/2014 в случае если несколько записей max(data_r) Это основные поля для отбора по 1 записи на разновидность на дату. Как-то так. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2017, 21:27 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
Подскажите как из вот таких данных Код: sql 1. 2. 3. 4. 5.
Получить вот такое: Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2017, 22:47 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
akrush, Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2017, 23:02 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#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. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2017, 23:03 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
__Avenger__, Спасибо, попробую ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2017, 23:24 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
akrush, Была в своё время такая проблема. Делал одну достаточно сложную печатную форму, меню-раскладку для приготовления питания (ФОРМА N 44-МЗ). Решил проблему одной временной таблицей (см. CREATE GLOBAL TEMPORARY TABLE .....) и одной серверной процедурой, в которой перед печатью заполняю эту временную таблицу. Преимущество в том, что всё делается на сервере, в процедуре можно реализовать весьма изощрённую логику, которую SQL-запросом подчас не решить. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2017, 18:48 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
zeon11, увы, сложные процедуры мне пока не по зубам. если не сложно - можете на моем примере показать пример/принцип как написать процедуру. я всеми руками за, но я только учусь ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2017, 23:07 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2017, 23:44 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
Спасибо всем за советы. Кое что у меня получилось. Но развернуть так как мне хочется в одном запросе пока не получается. Разбиваю на несколько Этапов во временные таблицы. И вот тут "лыжи перестали ехать". Исходные данные в первом посте, но таблица TMP_TARIF расширилась. Код: 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.
Ключевые поля ориентируясь на которые нужно получить максимальную: BD, NUMB, TARN, COD_POSL, COD_RIZN После получения максимальной даты, хочу дополнить остальными полями. Делать сразу Group by не могу т.к. данные по другим полям могут быть разными и тогда результат не тот. Делаю все Хранимой процедурой: Код: 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. 55. 56. 57. 58. 59. 60. 61. 62. 63.
Суть вопроса: по отдельности 2 запроса отрабатывают правильно. Пробовал Suspend ставить в нескольких местах - результат - пустая выборка. Подскажите где правильно поставить Suspend. Алгоритм Процедуры вижу такой: 1. Выбираем максимальные даты по ключевым полям: BD, NUMB, TARN, COD_POSL, COD_RIZN, плюс сами поля даты DATA_TR, DATA_E, DATA_R по указанному критерию DATA_TR=:data Получили набор строк. 2. Из той же таблицы пытаюсь выбрать данные по остальным полям, в условиях отбора - конкретные значения из первого запроса по ключевым полям. Что я неправильно делаю. Почему результат нулевой ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2017, 17:17 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
akrush, Нет записей с max(DATA_TR) = DATA_TR и при этом max(DATA_E) = DATA_E и при этом max(DATA_R) = DATA_R ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2017, 21:12 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
m7m, Есть. Еще раз повторю - если из хранимой процедуры выполнить запросы отдельно - все выполняется и записи есть ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2017, 21:29 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
akrushm7m, Есть. Еще раз повторю - если из хранимой процедуры выполнить запросы отдельно - все выполняется и записи есть Еще раз повторяю, записей нет, если max(DATA_TR) = DATA_TR and max(DATA_E) = DATA_E and max(DATA_R) = DATA_R. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2017, 21:46 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
akrushm7m, Есть. Еще раз повторю - если из хранимой процедуры выполнить запросы отдельно - все выполняется и записи есть а чего повторять во втором селекте Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
и что остается а только один вариант нет записей с Код: sql 1.
сюда же входит и вариант с :data_e=null или :data_r=null я не претендую на то что очень внимательно смотрел однако там то и смотреть особо не на что в смысле все прозрачно и остается еще два варианта я что-то пропустил ты что-то недописал ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2017, 21:52 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
m7m, Спасибо. Получилось убрав ДАТА_Е из условий, т.к. есть один период где ДАТА_Е is null ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2017, 22:06 |
|
Как развернуть таблицу по горизонтали
|
|||
---|---|---|---|
#18+
akrushm7m, Спасибо. Получилось убрав ДАТА_Е из условий, т.к. есть один период где ДАТА_Е is null а может Код: sql 1.
надо было заменить на Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2017, 08:03 |
|
|
start [/forum/topic.php?fid=40&fpage=47&tid=1561681]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
79ms |
get tp. blocked users: |
2ms |
others: | 314ms |
total: | 493ms |
0 / 0 |