|
|
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
Руслан Дамирович, Во первых, спасибо за конструктивное предложение и за желание помочь. Нет, тут никто не злой и все правы:) Только нервные немного. Ну да, никто не железный, и я тоже:) Тяжело отвечать каждый раз новому гуру на те же упрёки :) Только одному всё объяснишь, следующий появляется. Но это хорошо - мощный траффик гуру детектед. Во вторых, вы дали исчерпывающий ответ на вопрос заданый там. Здесь вашего скрипта недостаточно по причине которую я уже много раз тут озвучил. 3. Прекрасно понимаю что хочу. Думал достаточно. 4. Код готов ещё вчера и выдаёт именно тот результат что требовался. 5. В рамках проявления доброй воли и попытки выяснить для себя насчёт DISTINCT в OUTER APPLY чуть позже постараюсь запостить пример Input/Output + скриптик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2017, 17:59:28 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
CammomileНу ты же можешь упростить до вменяемого уровня! Нафига нам проникать мозгом твои сложные структуры, когла концептуально вопрос о том, как юзать ссылки цте на цте и аплаи? Прав совершенно. Учту на будущее. Понял что на этом не стоит экономить время. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2017, 18:01:46 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
slovnet4. Код готов ещё вчера и выдаёт именно тот результат что требовался. Мы так и поняли, что ты хочешь узнать, а можно ли сделать лучше (быстрее/удобнее/нагляднее). Но твой вопрос в первом посте был слишком абстрактным, чтобы ответить на него адекватно. Потому и начали слегка подначивать. Ты-таки раздуплился на кое-какой код, но без данных - никто не будет пытаться его улучшить, так как он и так работает. А твой вопрос о том, что нужен нарастающий итог по заказу, а не по деталям заказа - вообще не имеет смысла с моей точки зрения. Потому и попросил исходные данные и результат, чтобы понять, что именно ты хотел этим сказать. Так что ждем портянку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2017, 18:09:28 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
По предложению уважаемых комрадов формулирую вопрос правильно: Input: OrdNo Date PartName OrdQtyЗаказ1 01/02/18 Part1 5Заказ2 01/01/18 Part1 8Заказ3 01/05/18 Part1 3Заказ4 01/01/17 Part2 10Заказ5 01/01/19 Part2 6 OrdNo WorkOrderЗаказ1 WO1Заказ1 WO2Заказ2 WO3Заказ2 WO4Заказ3 WO5 PartName BalancePart1 20Part2 29 Надо выдать все заказы (OrdNo), Date, PartName, OrdQty, Balance с распределением остатков по заказам с сортировкой по дате + ЗаказНаПроизводство (WorkOrder) привязанный к заказу. Соответсвенно заказы 4 и 5 выпадают, а заказы 1 и 2 выдают по две записи (поскольку на каждый есть по 2 WorkOrder) Однако распределением остатков надо произвести на уровне заказа, без разбивки по WorkOrder. Требуемый результат выборки: OrdNo Date PartName OrdQty AllocatedOrdQty AllocatedBalance TotalBalance WorkOrderЗаказ2 01/01/18 Part1 8 8 20 20 WO3Заказ2 01/01/18 Part1 8 8 20 20 WO3Заказ1 01/02/18 Part1 5 13 12 20 WO1Заказ1 01/02/18 Part1 5 13 12 20 WO2Заказ3 01/05/18 Part1 3 16 7 20 WO5 Скрипт в следующем посте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2017, 18:35:56 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
Руслан Дамирович, Раздуплился как только попросили. Уже даю. Пару минут, надо выкинуть лишнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2017, 18:40:25 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
Ну почему не так то?! Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2017, 18:43:16 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
[src][/SRC] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2017, 19:07:52 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2017, 19:08:49 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
Отдельно непонятно зачем тут вообще сортировка по WorkOrder когда за ним ничего не стоит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2017, 19:10:36 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2017, 19:16:19 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
CammomileОтдельно непонятно зачем тут вообще сортировка по WorkOrder когда за ним ничего не стоит. Вроде про сортировку по WorkOrder нигде в условиях не упоминалось. Но сам WorkOrder юзер хочет видеть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2017, 19:19:48 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
CammomileНу почему не так то?! Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Понял, ну, в следующий раз. Хотел как красивше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2017, 19:21:10 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
Cammomile, Вот именно если сделать так то на каждую запись по Ordname где 2 WorkOrder'a будет удвоен нарастающий итог. Должно быть так: OrdNo Date PartName OrdQty AllocatedOrdQty AllocatedBalance TotalBalance WorkOrderЗаказ2 01/01/18 Part1 8 8 20 20 WO3Заказ2 01/01/18 Part1 8 8 20 20 WO3Заказ1 01/02/18 Part1 5 13 12 20 WO1Заказ1 01/02/18 Part1 5 13 12 20 WO2Заказ3 01/05/18 Part1 3 16 7 20 WO5 А будет так: OrdNo Date PartName OrdQty AllocatedOrdQty AllocatedBalance TotalBalance WorkOrderЗаказ2 01/01/18 Part1 8 8 20 20 WO3Заказ2 01/01/18 Part1 8 16 12 20 WO3Заказ1 01/02/18 Part1 5 21 4 20 WO1Заказ1 01/02/18 Part1 5 26 -1 20 WO2Заказ3 01/05/18 Part1 3 29 -6 20 WO5 С подбивкой баланса в это время суток мог ошибиться, но смысл ясен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2017, 19:46:40 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
Ну убери тогда джойн на воркинг ордерс. Вместо него напиши вере ордернум ин... Рассчитай набегающий итог без ордеров, а потом уже помнож на них. Все ещё без цте и аплаев. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2017, 20:39:09 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
Cammomile, А, у меня 2008. unbounded preceding не сработает. Забыл что пробовал уже. "Рассчитай набегающий итог без ордеров, а потом уже помнож" это ж выходим обратно на CTE, или лыжи не едут? Ну типа свести там все выборки. Да и для APPLY надо в CTE подготовить ROW_NUMBER? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 00:16:02 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 00:17:19 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
О, спасибо. Правда засаду с unbounded preceding всё равно надо как-то обойти. А такой код отработает быстрее чем CTE? У меня с CTE очень тормозит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 00:27:42 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
Вообще, и правда, так увлёкся CTE что протормозил насчёт обычного вложенного селекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 00:29:41 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
slovnetО, спасибо. Правда засаду с unbounded preceding всё равно надо как-то обойти. А такой код отработает быстрее чем CTE? У меня с CTE очень тормозит. Что вы к этому CTE придрались... Это просто более удобная форма записи запроса. Код: sql 1. 2. 3. 4. 5. 6. 7. SQL сервер разворачивает ваше CTE в одно большое выражение... И если вам кажется что Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Сервер 1 раз выполнит SELECT * FROM TableA то вы заблуждаетесь.... Потому что он развернет это в Код: sql 1. 2. 3. Как видите читаем TableA 2 раза... P.S. Код с оконными функциями отработает быстрее чем вложенные корреляционные запросы, которым кстати тоже нарастающие итоги считаются... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 00:40:20 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
https://blogs.technet.microsoft.com/isv_team/2011/07/26/1080/ Вот вам 4 примера расчета нарастающих итогов... Выбирайте какой хотите.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 00:42:26 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
X-Cite, Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 01:03:29 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
X-Cite https://blogs.technet.microsoft.com/isv_team/2011/07/26/1080/ Вот вам 4 примера расчета нарастающих итогов... Выбирайте какой хотите.. Лучший из 4х примеров автор не может, у него лапки 2008й. 2 других - корявое тормозное бе. Так, что выбор только один - сэлф джойн. Кстати, это очень показательный топик. В очередной раз человек вместо того, чтоб задать вопрос по сути задачи, задает вопрос по сути того, что он принял за её решение. Ведь "Как использовать ОТВ в ОТВ" и "Как посчитать набегающий итог без окон" - принципиально разные задачи. Пожалуй, добавлю этот топик в закладку, как эталонный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 09:43:27 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
Cammomile, Вообще-то всё ровно наоборот. Изначальный была описана суть задачи и задан вопрос каков best practice. Здесь (кроме десятков неконструктивных наездов) советовали варианты с CTE. И я так до сих пор и не понял в чём преимущество предложенного Вами решения перед CTE. А учитывая 2008 APPLY вроде как оптимальное решение. Вообще, это очень показательный топик, хорошо демонстрирует непонятки между новичком и экспертом. Новичок как-бы движется в темноте, наощупь. Не знает, что именно ему надо, как правильно спросить, где искать. Незнание возможностей синтаксиса здесь - самая маленькая проблема. Поэтому задаёт вопрос общий - как лучше сделать. Каков консепт? А ему в ответ - чего синтаксис не гуглил??!!! Начинается длинная разборка насчёт синтаксиса. А через три простыни выясняется что решение совсем не там. Тогда наезд - а зачем про этот синтаксис спрашивал???!!! В любом случае, мне лично из этой переписки один сплошной профит, получил хороший мастер-класс по T-SQL. За что всем пинавшим-помогавшим огромное спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 11:32:54 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
slovnetВообще, это очень показательный топик, хорошо демонстрирует непонятки между новичком и экспертом. ... Поэтому задаёт вопрос общий - как лучше сделать. Каков консепт? Именно, грамотный новичок и задает вопрос - как лучше сделать. А у вас получилось: "Я тут два гвоздодера нашел, как мне их соединить? Может сваркой? Или еще как?" И только через пару страниц выясняется, что надо шуруп закрутить, и лучше всего воспользоваться шуруповертом (или, учитывая ограниченность ваших инструментов из-за версии сервера - отверткой). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 11:58:37 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
Что значит чем лучше мой вариант чем ЦТЕ. Вопрос в том, для решения какой задачи лучше? Для набегающего итога? Окно >> Сэлфджоин >> ОТВ >> Курсор Поскольку твой 2008 не может решить задачу окном, то тебе нужен самоджойн. Почему лучше, потому, что быстрее. Просто быстрее во всех случаях. Для инкапсуляции "промежуточных наборов данных"? Это опять же бабушка на двое сказала. Лично я не люблю СТЕ из-за ограничений, которые они накладывают на написание кода. СТЕ ты обязан использовать СРАЗУ после объявления, и никак иначе. Понятно почему, потому, что это (кроме случая с рекурсией) простой синтаксический сахар, который развернется, в итоге в тоже что и Код: sql 1. . Работу СТЕ ты не можешь, например, легко проверить во время написания процедуры, в отличие от #таблицы. Ласт, бат нот лист, весь синтаксис ОТВ довольно необычен для скуль кода, и прямо скажем, режет глаз, особенно когда один за другим идет ворох ОТВшек- сложно распутывать. Таким образом именно для меня ОТВ вообще ничем не лучше других способов вращать данные, при этом наличиствуют очевидные недостатки. В моей картине мира есть ровно ДВА случая, когда нужно использовать именно ОТВ. а) рекурсивные запросы б) ты пишешь инлайн функцию, в которой у тебя физически нет возможности использовать временные таблицы для каких то предрасчетов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 12:01:57 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39563971&tid=1690743]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
252ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
81ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 624ms |

| 0 / 0 |
