|
Возможно ли сделать без подзапросов такое суммирование
|
|||
---|---|---|---|
#18+
Всем привет. Если туплю - извините. Есть некая таблица транзакций ( logtrans ), столбцов - много, для простоты изобразил CTE с четырьмя. В гриде каждой логической транзакции отвечает несколько "обычных" транзакций. Выводиться должно всё так, как изображено в CTE. НО с суммами - иначе: внизу грида выводится сумма следующим образом - totalamount1 - обычная сумма по всем amount1 , а для totalamount2 должны суммироваться лишь последние amount2 (т.е. с максимальным transid ). Можно ли это как-то сделать с минимальным вмешательством в существующий запрос? Столбец amount2 (и соответствующая сумма) были добавлены недавно, основной запрос - страшный, уродливый и длинный. MS SQL 2012. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 00:52 |
|
Возможно ли сделать без подзапросов такое суммирование
|
|||
---|---|---|---|
#18+
Nafigator, я несколько раз попытался прочесть что вам надо но так до конца и не понял. придется гадать: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
и у вас кстати CTE корявая, в некоторых стейтментах union select не хватает стобцов ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 02:30 |
|
Возможно ли сделать без подзапросов такое суммирование
|
|||
---|---|---|---|
#18+
felix_ff, благодарю, примерно так и представлял - хотел убедиться, что такой способ - оптимальный... Да, в CTE пропустил в конце столбцы transid, но идею Вы верно поняли. Маленький вопрос: order by 1/0 - что сие означает? Никогда не встречал :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 02:59 |
|
Возможно ли сделать без подзапросов такое суммирование
|
|||
---|---|---|---|
#18+
Nafigator, Выражение заглушка чтобы не писать столбец сортировки. Ну кстати я тут ступил его лучше указать вам же надо в порядке последнего trans_id, т.е должно быть так: Код: sql 1.
Если бы версия сиквела позволяла можно бы было использовать оконку first_value но у вас 2012. Еще вариант через коррелирующий подзапрос с outer apply ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 09:05 |
|
Возможно ли сделать без подзапросов такое суммирование
|
|||
---|---|---|---|
#18+
felix_ff, Имхо, судя по изначальной формулировке, там надо во все оконные функции добавить партиционирование: Код: sql 1. 2. 3. 4. 5. 6.
Иначе условие Код: sql 1.
будет выполняться только для одной строки из всей выборки. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 10:13 |
|
Возможно ли сделать без подзапросов такое суммирование
|
|||
---|---|---|---|
#18+
Nafigator, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 10:17 |
|
Возможно ли сделать без подзапросов такое суммирование
|
|||
---|---|---|---|
#18+
Ennor Tiegael, можно еще так Код: sql 1.
Соответственно, тогда count(1) не понадобится и сравнение в результирующем запросе Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 12:08 |
|
Возможно ли сделать без подзапросов такое суммирование
|
|||
---|---|---|---|
#18+
nullin, Да это наверное самый профитный вариант. хотя ТС не прелоставил что в итоге хочет получить, поэтому здесь можно только догадываться :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 12:12 |
|
Возможно ли сделать без подзапросов такое суммирование
|
|||
---|---|---|---|
#18+
nullin, Согласен, так лучше. Торопился с работы, не додумал :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 13:31 |
|
Возможно ли сделать без подзапросов такое суммирование
|
|||
---|---|---|---|
#18+
Господа, большое спасибо за внимание к вопросу! Как часто бывает, всплыли некоторые подробности. Во-первых, в конечном селекте не фигурирует transid. Во-вторых, amount2 в пределах каждого "окошка" (транзакции) одинаковы - можно брать любое. То есть данные выглядят следующим образом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Сумма по amount2 - это сумма однократных вхождений amount2 в каждую транзакцию, т.е. -55.0 + 1500.0 - 2100.0 При таких "раскладах" row_number() - единственный вариант, так? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 17:26 |
|
Возможно ли сделать без подзапросов такое суммирование
|
|||
---|---|---|---|
#18+
Nafigator, тогда все проще: Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 18:06 |
|
Возможно ли сделать без подзапросов такое суммирование
|
|||
---|---|---|---|
#18+
nullin, ну, да, самый простой вариант. Но правильно ли я понимаю, что на 2012-м SQL в любом случае придётся "протащить" эту промежуточную агрегацию (max с группировкой) - затем уже сумму по этой агрегации, т.е. в одну строчку не сделать? Почему этим заморочился вообще - потому что в существующем запросе несколько десятков столбцов, явно выбираемых, многие из которых суммируются, плюс часть запроса "клеится" в коде (куча условий, фильтров)... Надеялся, что удастся что-то с партиционированием намутить для вычисления этой суммы - в одну строку, не добавляя уровень... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 18:36 |
|
Возможно ли сделать без подзапросов такое суммирование
|
|||
---|---|---|---|
#18+
Nafigator, Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 20:44 |
|
Возможно ли сделать без подзапросов такое суммирование
|
|||
---|---|---|---|
#18+
nullin, да, я понял идею - но это тот самый промежуточный select. А затем, в следующем запросе, мне надо просуммировать все MAX-ы из "нашего-вашего", чтобы получить итоговый sumamount2... В общем, всё-таки обошёлся row_number - втулил его в один из запросов и впоследствии прокейсил внутри суммы. Всем спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 21:47 |
|
|
start [/forum/topic.php?fid=46&fpage=69&tid=1686508]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 340ms |
total: | 474ms |
0 / 0 |