|
Сложный запрос с формированием текстовых строк
|
|||
---|---|---|---|
#18+
Есть база данных (СУБД MS SQL 2008) с таблицами машины CREATE TABLE [dbo].[Cars]( [CarID] int NOT NULL, [CurRouteOrder] int NULL, -- порядковый номер текущего маршрута [CarDescription] nvarchar(30) NULL ) маршруты CREATE TABLE [dbo].[Routes]( [RouteId] int NOT NULL, [RouteOrder] int, -- порядковый номер текущего маршрута [CarID] int NOT NULL, [RouteDescription] nvarchar(30) NULL ) маршрутные точки CREATE TABLE [dbo].[RoutePoints]( [RouteId] int NOT NULL, [NRP] int NOT NULL, [status] int NOT NULL, -- 3 - доставка пропущена [DeliveryTime] datetime NOT NULL, -- планируемое время доставки [Address] nvarchar(30) NOT NULL, ) нужно для каждой машины вывести CarDescription, количество пропущенных точек суммарно в текущем и предыдущем маршрутах, наиболее раннее пропущенное время доставки в текущем и предыдущем маршрутах, а также строчки с номерами 3-х пропущенных точек маршрута с минимальными номерами для текущего и предыдущего маршрута. Предыдущий маршрут - с максимальным RouteOrder меньше текущего для данной машины. например: Код: plaintext
12 - количество пропущенный точек доставки суммарно в текущем и предыдущем маршрутах. 2021.04.20 10:45 - наиболее раннее пропущенное время доставки. 2,5 - строка с номерами пропущенных точек доставки в текущем маршруте через запятую. 5,8,9 - тоже, но для предыдущего маршрута. RouteId текущего и предыдущего маршрутов для CarID = NNN SELECT @CurRouteId=RouteId, @PrevRouteId=(SELECT TOP(1) RouteId FROM dbo.Routes WHERE RouteOrder < Curr.RouteOrder AND CarID=NNN ORDER BY RouteOrder DESC) FROM dbo.Routes AS Curr WHERE CarID=NNN and RouteOrder=(SELECT CurRouteOrder from dbo.Cars WHERE CarID=NNN) Вопросы: 1) для текущего и предыдущего маршрутов получение пропущенного времени доставки и кол-во пропущенных точек SELECT COUNT(*), MIN(DeliveryTime) FROM dbo.RoutePoints WHERE (RouteId=@CurRouteId OR RouteId=@PrevRouteId) AND status=3 получение номеров 3-х пропущенных точек текущего маршрута с минимальными номерами в виде строки: DECLARE @STR NVARCHAR(30); SELECT TOP(3) @STR = CASE WHEN @STR IS NULL THEN CAST(NRP AS NVARCHAR) ELSE @STR + ', ' + CAST(NRP AS NVARCHAR) END FROM dbo.RoutePoints WHERE RouteId=@CurRouteId AND status=3 ORDER BY NR ASC для предыдущего маршрута - аналогично, только RouteId=@PrevRouteId Можно ли эти операции как-то объединить в одну? Если да, как? Или может оставить их как есть в надежде, что прочитанные записи кэшируются и значительного проигрыша от прохода второй раз по тем же записям не будет. 2) как более или менее оптимально получить таблицу, содержащую CarID, CarDescription, RouteId текущего, RouteId предыдущего маршрутов. Т.е. хорошо бы, чтобы MS SQL Server догадался пройти по таблице Routes только один раз (т.к. она заметно больше, чем Cars) Если кто-нибудь поможет собрать все перечисленное выше в один запрос, получающий сразу нужную таблицу данных - будет вообще здорово. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2021, 17:41 |
|
Сложный запрос с формированием текстовых строк
|
|||
---|---|---|---|
#18+
m7n5g, слишком сложно, чтобы вдумываться. Если хотите обсудить, то напишите что вы хотите получить и заполните таблицы демонстрационными данными. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2021, 17:27 |
|
Сложный запрос с формированием текстовых строк
|
|||
---|---|---|---|
#18+
И используйте тег [SRС] при оформлении языка SQL ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2021, 17:58 |
|
Сложный запрос с формированием текстовых строк
|
|||
---|---|---|---|
#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. 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.
В итоге должно получиться Cars.CarIDПропущено Первый пропуск Пропуски в текущем маршруте Пропуски в предыдущемCar_122021-01-20T12:303; 4Car_232021-01-20T10:2012; 3Car_332021-01-20T11:2042; 4 Первый вопрос, как эффективно сформировать временную таблицу (а можно ли без нее обойтись?) Код: sql 1. 2. 3. 4. 5. 6.
В этой таблице должно оказаться CarID ID предыдущего маршрута ID текущего маршрута1NULL12 34387 Машин не очень много. Допустим 100. А вот маршруты [Routes], скорее всего, чистить вообще никто не будет (нужна история). Т.е. их может быть десятки тысяч. [RoutePoints] в десятки раз больше. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2021, 14:55 |
|
Сложный запрос с формированием текстовых строк
|
|||
---|---|---|---|
#18+
Маркетплейсы закончились, логисты подтянулись... Думаю что топик надо перенести в "Работа" ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2021, 09:53 |
|
Сложный запрос с формированием текстовых строк
|
|||
---|---|---|---|
#18+
SIMPLicity_ Маркетплейсы закончились, логисты подтянулись... Думаю что топик надо перенести в "Работа" Да ну обычные ленивые студиозусы :) зы помню у нас на практике БД по фоксу разные задания были так препод сказал вы ж тока данные набивайте нормальные а то я была задача про поезд так автор сделал поезд из 3 вагонов в каждом по 4 места :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 10:30 |
|
|
start [/forum/topic.php?fid=46&fpage=25&tid=1684738]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
others: | 308ms |
total: | 440ms |
0 / 0 |