Применение логики к сгруппированным результатам SQL - PullRequest
0 голосов
/ 27 сентября 2019

Требуется некоторая теоретическая справка по Oracle SQL о наилучшем способе обработки сгруппированного набора результатов.Я понимаю, почему это группируется так, как это происходит, но я пытаюсь выяснить, есть ли способ

У меня есть таблица, в которой перечислены действия некоторых МВЗ.Это выглядит так:

Company    Object    Sub    July    August
A          1                20      50
A          1                10      0
A          1         10     0       20
B          1                0       0

Затем мне нужно указать, была ли активность в августе.Поэтому я пишу оператор CASE, в котором если август = 0, то «FALSE», ELSE «TRUE».Затем мне нужно сгруппировать все записи по компании, объекту и подразделу.Накопительная колонка представляет собой сумму за июль и август.Тем не менее, мой вывод выглядит следующим образом:

Company    Object    Sub    SUM    ActivityFlag
A          1                70        TRUE
A          1                10        FALSE
A          1         10     20        TRUE
B          1                0         FALSE

Мне нужно вот что:

Company    Object    Sub    August    ActivityFlag
A          1                80        TRUE
A          1         10     20        TRUE
B          1                0         FALSE

Очевидно, это упрощенный пример гораздо более серьезной проблемы, но я пытаюсьпродумать эту проблему теоретически, чтобы я мог применить аналогичную логику к моей актуальной проблеме.

Есть ли хороший метод SQL для добавления суммы в августе для строк 1 и 2, а затем выбора ИСТИНЫ, чтобы это отображалось в одной строке?Я надеюсь это имеет смысл.

Ответы [ 2 ]

2 голосов
/ 27 сентября 2019

использовать агрегацию

select company,object,sub,sum(july+august),
max(case when august>0 then 'True' else 'false' end)
from table_name group by company,object,sub
1 голос
/ 27 сентября 2019

Если вы помечаете детали с помощью оператора case, вы можете либо поместить регистр в сумму, аналогичную:

MAX(CASE WHEN August = 0 THEN 1 ELSE 0 END)

Другой способ, если агрегировать флаг вверх во внутреннем запросе:

SELECT IsAugust = MAX(IsAugust) FROM
(
   ...
   IsAugust = CASE WHEN August=0 THEN 1 ELSE 0 END
   ...
)AS X
GROUP BY... 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...