|
Нужна помощь с запросом по базовой таблице с левым добавлением данных из диапазона дат
|
|||
---|---|---|---|
#18+
Здравствуйте, помогите написать запрос переношу базу Excel (СКУД учет рабочего времени) на клиент-сервер MSSQL (синтаксис для 2000-2005 версии), клиент на c#. Не могу понять как сделать один запрос (для datatable) для отчета вида принятого в компании фрагмент исходные данных таблица пользователей tbUsers (50 записей) Код: plaintext 1. 2. 3. 4. 5.
таблица специальных отметок tbSpecialMarks (10 записей) Код: plaintext 1. 2. 3. 4.
таблица проходов tbPass (когда, кто, почему, сколько часов отработал) (55000 записей) Код: plaintext 1. 2. 3. 4. 5. 6. 7.
для итогового отчета (Excel) мне нужно получить набор данных по выбранным юзерам (tbUsers) (2 строки на запись) и диапазону дат из таблицы прохода (tbPass) - вида вариант 1 (одна колонка на дату - две строки данных) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
как сделать запрос по юзерам (tbUsers) и одной дате (из tbPass) понятно - выбрать юзеров и через left join подогнать к ним данные на дату... а вот как сделать запрос по диапазону дат и подогнать их слева к юзеру... - не могу придумать (да и ограничение по синтаксису 2000-2005 TransactSQL) не подскажите как это можно разрулить? итоги можно и в виде одной строки - я из C# раскидаю потом как нужно вариант 2 (две колонки на дату - одна строка данных) Код: plaintext 1. 2. 3. 4. 5.
вообще не понимаю как сделать такую выборку одним запросом..., не подскажите? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 15:28 |
|
Нужна помощь с запросом по базовой таблице с левым добавлением данных из диапазона дат
|
|||
---|---|---|---|
#18+
ef1 как сделать запрос по юзерам (tbUsers) и одной дате (из tbPass) понятно - выбрать юзеров и через left join подогнать к ним данные на дату... а вот как сделать запрос по диапазону дат и подогнать их слева к юзеру... - не могу придумать (да и ограничение по синтаксису 2000-2005 TransactSQL) выбрать юзеров и через left join подогнать к ним датЫ и через left join подогнать к ним данные на дату... ЗЫ. Ограничения не в синтаксисе - ограничения в голове. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 16:49 |
|
Нужна помощь с запросом по базовой таблице с левым добавлением данных из диапазона дат
|
|||
---|---|---|---|
#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.
результат Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
а вот как даты завернуть направо для этих двух человек (в примере)... не понимаю... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 17:38 |
|
Нужна помощь с запросом по базовой таблице с левым добавлением данных из диапазона дат
|
|||
---|---|---|---|
#18+
Варианта ажно два: 1. Осознать, что это нафиг не надо. Ибо это не ексель. 2. Разучить pivot. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 17:42 |
|
Нужна помощь с запросом по базовой таблице с левым добавлением данных из диапазона дат
|
|||
---|---|---|---|
#18+
я думал через обобщение with как то... но не понимаю как но тут засада еще в том - что справа мне нужно показать весь диапазон исследуемых дат в примере я запрашиваю 13 дат от '20210102' и до '20210115' и хочу забить забить их null если данных по проходам нет т.е. строка вида (в общем случае) фио+ данные фио + 13 колонок дат с результатами ... так наверно вообще нельзя сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 17:52 |
|
Нужна помощь с запросом по базовой таблице с левым добавлением данных из диапазона дат
|
|||
---|---|---|---|
#18+
ef1 я думал через обобщение with как то... но не понимаю как но тут засада еще в том - что справа мне нужно показать весь диапазон исследуемых дат в примере я запрашиваю 13 дат от '20210102' и до '20210115' и хочу забить забить их null если данных по проходам нет т.е. строка вида (в общем случае) фио+ данные фио + 13 колонок дат с результатами ... так наверно вообще нельзя сделать? Реляционные базы данных не допускают таблиц с переменным количеством колонок. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 17:58 |
|
Нужна помощь с запросом по базовой таблице с левым добавлением данных из диапазона дат
|
|||
---|---|---|---|
#18+
ну хорошо - я могу запросить фиксированный диапазон дат - например 32 дня (с избытком) для такого случая? чувствую одним местом что можно сделать ps вся структура данных моя - исходники (данные проходов) Excel - аж с 2007 года (тоже моя структура - просто подтормаживать начала), клиента C# написал, базу создал все импортировал, осталось написать основной запрос для отчета - отчет естественно пойдет в Excel - руководство привыкло к шаблону уже 2 месяца разработки - и хотелось завершить красивым и быстрым запросом для отчета... а так костылей можно навставлять конечно - но это не эстетично )) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 18:06 |
|
Нужна помощь с запросом по базовой таблице с левым добавлением данных из диапазона дат
|
|||
---|---|---|---|
#18+
ef1 ну хорошо - я могу запросить фиксированный диапазон дат - например 32 дня (с избытком) для такого случая? чувствую одним местом что можно сделать ps вся структура данных моя - исходники (данные проходов) Excel - аж с 2007 года (тоже моя структура - просто подтормаживать начала), клиента C# написал, базу создал все импортировал, осталось написать основной запрос для отчета - отчет естественно пойдет в Excel - руководство привыкло к шаблону уже 2 месяца разработки - и хотелось завершить красивым и быстрым запросом для отчета... а так костылей можно навставлять конечно - но это не эстетично )) Таблица с 32-я колонками. + 32 запроса обновления. Ну, можно один запрос с 32-я join-ами. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 19:04 |
|
Нужна помощь с запросом по базовой таблице с левым добавлением данных из диапазона дат
|
|||
---|---|---|---|
#18+
в принципе через временную таблицу можно замутить вот здесь на этом сайте т.е. написать udf закинуть туда диапазон дат создать с ними временную таблицу пересечь ее с реальными данными в колонку(ячейку) с датой вставлять два значения с разделителями или в формате xml для красоты и удалить ее в конце функции ... разбираюсь пока как красиво это оформить ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 19:13 |
|
Нужна помощь с запросом по базовой таблице с левым добавлением данных из диапазона дат
|
|||
---|---|---|---|
#18+
запутался короче 1. сделал функцию генерации дат календаря по запросу - getCalendar Код: 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.
2. сделал функцию заполнения календаря данными из таблицы проходов EventsPass - twt_uploadCalendar Код: 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.
3. добавил хп динамического pivot - SP_Dynamic_Pivot Код: 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. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85.
4. Развернул и казалось бы добавить это к списку юзеров слева но Код: sql 1. 2. 3. 4. 5. 6. 7.
pivot агрегирует только одно значение, а мне нужно два - specialMark & workTime (строку и число), поэтому в агрегатор положил id записи проходов passId (таблицы EventsPass ) чтобы потом его разобрать подзапросами или курсором (в общем не знаю как, это нужно пройти по каждой колонке даты а сколько их - заранее не известно... диапазон я запрашиваю на вызове) но наверно это путь в никуда... может действительно формировать динамический запрос с '32' left join на каждую дату... или в клиенте просто по факту выполнить все '32' запроса на каждую отдельную дату... в общем не получается сводная таблица в лоб ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2021, 19:42 |
|
Нужна помощь с запросом по базовой таблице с левым добавлением данных из диапазона дат
|
|||
---|---|---|---|
#18+
ef1, колонки календаря лучше формировать на клиенте, а на сервере использовать string_agg вместо pivot. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2021, 00:57 |
|
Нужна помощь с запросом по базовой таблице с левым добавлением данных из диапазона дат
|
|||
---|---|---|---|
#18+
можно и на клиенте создать строки с колонками календаря и бросить их в параметры pivot... но поскольку все равно динамика, и pivot не в цикле - проще на сервере все оформить - в данном случае пока думаю как в агрегатор pivot MAX передать строку или функцию которая отобразит нужные мне данные ps string_agg - не пройдет - у меня заявлено в поддержке проекта - минимальная версия 2005, а эта функция для 2017 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2021, 08:37 |
|
Нужна помощь с запросом по базовой таблице с левым добавлением данных из диапазона дат
|
|||
---|---|---|---|
#18+
осталось чуть чуть 1. Переписал функцию загрузки календаря данными добавив туда строки для агрегатора pivot Код: 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.
2. исправил хп динамической генерации pivot - значение по умолчанию для агрегатора заменил с 0 на NULL Код: 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. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85.
3. развернул получил то что хотел по правой части см. картинку 4. остался последний вопрос самый простой )) мне нужно - в своей хп получить таблицу из хп п.п.3 - прикрепить ее слева к таблице пользователей (users) - и отдать клиенту C# но подскажите как сделать... я в своей хп должен создать #временную таблицу для приема данных из хп п.п.3 - но я не знаю ее реального размера (диапазон заказываемых дат - разный - не знаю заранее количества столбцов) ? -------- вызов и картинка к хп п.п.3 Код: sql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2021, 11:13 |
|
Нужна помощь с запросом по базовой таблице с левым добавлением данных из диапазона дат
|
|||
---|---|---|---|
#18+
финал - все получилось пользователи + динамический (диапазон дат) календарь событий (две udf, одна sp в ней один динамический запрос) синтаксис для MSSQL2005 основная sp для отчета Код: 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. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120.
вызов (из клиента C#) Код: sql 1.
результат (код и отчет не оптимизировал... - все в динамике... - проще на клиенте пропустить служебные столбцы) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2021, 11:13 |
|
Нужна помощь с запросом по базовой таблице с левым добавлением данных из диапазона дат
|
|||
---|---|---|---|
#18+
off функцию генерации дат календаря заменил на более скорострельную (+форматирование дат для наименований столбцов потребителям) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2021, 12:57 |
|
Нужна помощь с запросом по базовой таблице с левым добавлением данных из диапазона дат
|
|||
---|---|---|---|
#18+
off из замеченных ограничений (для mssql2005 + win server2003) 1. агрегатор pivot MAX - не обрабатывает (у меня во всяком случае) строки длиной более 50 символов (заменил формат xml на разделители для split в дальнейшем на клиенте)(сейчас передаю 6 параметров ~25 символов с разделителями) 2. количество динамически сформированных столбцов календаря/отчета не более 2000 шт - но и не нужно )) (поставил ограничитель на 500) по скорости выборка на 500 дат ~5-10 сек рабочая выборка на месяц (30 дат) ~ 0,5-1 сек - вполне нормально ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2021, 15:00 |
|
Нужна помощь с запросом по базовой таблице с левым добавлением данных из диапазона дат
|
|||
---|---|---|---|
#18+
собственно итог (картинки внизу) TimeWorkTracking sp показала себя нормально, в календарь упаковали данные, на клиенте распаковали, в excel выкинули и никаких сводных таблиц, все налету все просто и быстро ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2021, 13:30 |
|
|
start [/forum/topic.php?fid=46&gotonew=1&tid=1683999]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
1529ms |
get topic data: |
9ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 273ms |
total: | 1903ms |
0 / 0 |