|
Можно ли реализовать задачу без условных операторов и циклов?
|
|||
---|---|---|---|
#18+
Есть такой запрос Код: sql 1. 2. 3. 4. 5. 6.
Он работает неправильно, потому что вместо SUM(qty) <= qty_buy должно быть нечто такое: Код: sql 1. 2. 3. 4. 5. 6. 7.
Короче мне нужно суммировать не все поле, а только пока сумма значений некоторых его элементов не достигнет определенного значения. Возможно сделать это без условных операторов и циклов чисто средствами T-SQL, подскажите пожалуйста, очень нужно! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2020, 19:13 |
|
Можно ли реализовать задачу без условных операторов и циклов?
|
|||
---|---|---|---|
#18+
арт2010, Цикл предусматривает упорядоченность строк в таблице Deals. Вы хотите посчитать доход, не выходя за рамки количества товара на складе, и уважая очередность заказов, или можете передвигать строчки в deals для максимальности продаж? Например, у вас 100 свечек. Вчера вы договорились продать одну, а сегодня кто-то хочет купить все сто. Вы хотите посчитать доход от одной свечки, или от ста (передвинув вчерашнего покупателя в очереди)? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2020, 20:03 |
|
Можно ли реализовать задачу без условных операторов и циклов?
|
|||
---|---|---|---|
#18+
НеофитSQL, немного другое Есть таблица Код: 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.
Написал хранимку с курсором. Но выяснилось что нужно сделать без курсора, циклов и условных операторов, чисто средствами SQL Код: 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.
Перелопатил кучу инфы, но так до сих пор и не понял - возможно ли это. То, что возможно без курсора - очевидно. Но вот возможно ли без циклов или условных операторов? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2020, 20:17 |
|
Можно ли реализовать задачу без условных операторов и циклов?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2020, 20:47 |
|
Можно ли реализовать задачу без условных операторов и циклов?
|
|||
---|---|---|---|
#18+
арт2010, Я прочитал процедуру, но не увидел сортировку по дате. Возможно, вам SQL подает эти строки в хронологическом порядке по умолчанию? Вряд ли на это можно полагаться, добавьте в строку "ORDER BY id, client, product" также ", date_deal". Думаю, вам нужна функция SUM() OVER () - вот пример ее применения. https://codingsight.com/calculating-running-total-with-over-clause-and-partition-by-clause-in-sql-server/ Сам будучи новичком, я ей до сегодняшнего дня не пользовался, но поигравшись немного, увидел что Оракл (моя среда) не позволяет ее использовать в WHERE или в HAVING, поэтому для своего примера я добавил колонку и обернул в селект. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Этот запрос перечисляет студентов, пока суммарный возраст не превысит 30 - похоже на вашу задачу? Если нужно только ответ (бегущая сумма, которая не превышает 30) Код: sql 1. 2. 3. 4. 5.
Я не берусь написать MsSQL без ошибок, но мне интересно попробовать: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2020, 21:03 |
|
Можно ли реализовать задачу без условных операторов и циклов?
|
|||
---|---|---|---|
#18+
НеофитSQL, благодарю за помощь, завтра уже буду детально разбирать, но запрос в sql не сработал, в смысле, ошибки, попробую модернизировать ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2020, 21:33 |
|
Можно ли реализовать задачу без условных операторов и циклов?
|
|||
---|---|---|---|
#18+
Владислав Колосов, благодарю, попробую приспособить к своей задаче ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2020, 21:34 |
|
Можно ли реализовать задачу без условных операторов и циклов?
|
|||
---|---|---|---|
#18+
Как-то так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2020, 22:41 |
|
Можно ли реализовать задачу без условных операторов и циклов?
|
|||
---|---|---|---|
#18+
invm, огромное спасибо, натолкнули на мысль, мне нужно было примерно следующее Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Но тут один затык, мне нужен синтаксис не выше 2008, а там order by не допустимо в over. Как бы мне обойти это? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2020, 01:04 |
|
Можно ли реализовать задачу без условных операторов и циклов?
|
|||
---|---|---|---|
#18+
арт2010, вы чего то путаете, оконки сразу как появились c 2005 были с order by вот Вам ссылка на документацию к 2008 https://docs.microsoft.com/ru-ru/previous-versions/sql/sql-server-2008/ms189461(v=sql.100) а вот к 2005 https://docs.microsoft.com/ru-ru/previous-versions/sql/sql-server-2005/ms189461(v=sql.90) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2020, 01:38 |
|
Можно ли реализовать задачу без условных операторов и циклов?
|
|||
---|---|---|---|
#18+
felix_ff, тем не менее в 2014 все ок, а в 2008 - ругается на order и курение инета подтвердило это ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2020, 08:33 |
|
Можно ли реализовать задачу без условных операторов и циклов?
|
|||
---|---|---|---|
#18+
А вообще у меня работает все таки не совсем так как мне надо. Если перед продажей были только покупки, то все правильно работает. Но вот если были перед продажей не только покупки, но и другие продажи, надо уже считать не сумму произведений, деленную на оставшиеся акции, а как бы обнулять некоторые продажи полностью или частично, исходя из условия, что первыми продаются самые первые купленные акции. То есть например для id = 5, на предыдущем шаге id = 4 продали 20 штук, то есть id = 1 (10 акций) и id = 2 (10 акций) обнуляюся и в расчетах не участвуют. То есть для id = 5 учитываем только покупку при id = 3: profit = 20 * 2300 - (15 * 2150) / 15 * 20 = 3000 Причем "обнуляться могут продажи и частично" - это хорошо видно на примере id = 16 При id = 15 продали 30 штук - то есть они "обнуляют" 20 штук купленных при id = 13 и 10 штук купленных при id = 14, то есть в расчете участвует только покупка 10 штук при id = 14: profit = * 2300 - (10 * 2100) / 10 * 5 То есть получается хоть как нужен цикл с предусловием внутри этого запроса? Либо я просто не могу отбросить шоры процедурного мышления и понять как это сделать без циклов и ветвлений (если это вообще возможно???), помогите пожалуйста! Код: 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.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2020, 09:08 |
|
Можно ли реализовать задачу без условных операторов и циклов?
|
|||
---|---|---|---|
#18+
felix_ff, OVER() сам по себе - да, позволял ORDER BY с 2005, но только с ранжирующими функциями. Для обычных агрегаток типа sum / count поддержка over(order by) появилась только в 2012. ТС, Идите в форумный FAQ и смотрите, как сделать нарастающий итог на версиях до 2012. Там все будет медленно и печально. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2020, 09:33 |
|
Можно ли реализовать задачу без условных операторов и циклов?
|
|||
---|---|---|---|
#18+
Ennor Tiegael, у меня не нарастающий итог. Точнее не только он. Мне нужно аналог цикла с предусловием средствами SQL. То есть я вычислил некое суммарное количество купленных qty и проданных qty на определенном id. Дальше мне нужно вернуться на начальный id в рамках данного продукта и клиента и снова цикл: если текущий qty > 0 и сумма проданных qty - (сумма qty > 0 с начала и до текущего qty, включая его самого) > 0 тогда отбрасываем иначе sum_qty := sum_qty + qty(id) * price(id). Когда дошли до нужного id, считаем по формуле, причем sum_qty берется с предыдущего шага, а текущие qty и price - с текущего И так по всем группировкам продукт/клиент. Короче сложное условие, только отдаленно похожее на нарастающую сумму Вот я и пытаюсь понять самое главное - возможно ли это сделать чисто средствами SQL (+ временные таблицы), без использования if-else, while, функций, курсоров и прочих процедурных инструментов. Есть возможно, то есть смысл двигаться дальше в этом направлении иначе нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2020, 10:04 |
|
Можно ли реализовать задачу без условных операторов и циклов?
|
|||
---|---|---|---|
#18+
арт2010, сократите количество терминов до "приход" и "расход" и посмотрите,как можно сформулировать задачу без "акция", "обнуляют" и так далее. Мне , например, плохо понятно, много избыточной информации и перекрёстных ссылок в изложении. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2020, 11:46 |
|
Можно ли реализовать задачу без условных операторов и циклов?
|
|||
---|---|---|---|
#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.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2020, 13:14 |
|
Можно ли реализовать задачу без условных операторов и циклов?
|
|||
---|---|---|---|
#18+
Ennor Tiegael ...Для обычных агрегаток типа sum / count поддержка over(order by) появилась только в 2012. Не в 2008R2 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2020, 13:19 |
|
Можно ли реализовать задачу без условных операторов и циклов?
|
|||
---|---|---|---|
#18+
mnbvcx Ennor Tiegael ...Для обычных агрегаток типа sum / count поддержка over(order by) появилась только в 2012. Не в 2008R2 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2020, 15:20 |
|
Можно ли реализовать задачу без условных операторов и циклов?
|
|||
---|---|---|---|
#18+
Апну тему, может кто-нибудь таки подскажет в каком направлении двигаться, напомню это не просто нарастащий итог. Решил попробовать рекурсией, но столкнулся что не могу сделать вложенную рекурсию вида with bla-bla(id, ....) select id, ..., (with ... sum(qty)...) то есть не могу в значение поля первой рекурсии подставить результат второй рекурсии, хотя там sum и точно не будет multiple rows - sql ругается. так можно делать вложенную рекурсию и если да, то как? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 09:02 |
|
|
start [/forum/topic.php?fid=46&fpage=46&tid=1685558]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
24ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
83ms |
get tp. blocked users: |
2ms |
others: | 302ms |
total: | 450ms |
0 / 0 |