Вы, вероятно, не увидите значительного снижения производительности от того, что делаете сейчас, поскольку у вас уже есть все доступные данные, вы просто повторяете оценку случая.
Но вы не можете сослатьсяк псевдонимам столбцов для первых двух столбцов в пределах одного и того же уровня запроса.
Если вы не можете выполнить простой подсчет, как предложено @Zeki, потому что вы не уверены, что могут быть значения, отличные от нуля, иодин (хотя это выглядит скорее как двоичный эквивалент истина / ложь, поэтому вполне может быть проверочное ограничение, ограничивающее вас этими значениями), или, если вас больше интересует более общий случай, вы можете использовать встроенное представление как@jarhl предложил:
select Year_CW,
"Total_sampled(Checked)",
"Total_unsampled(Not_Checked)",
"Accepted",
"Accepted with comments",
"Request for rework",
"Rejected",
"Total_sampled(Checked)" + "Total_unsampled(Not_Checked)" as "Total_DS"
from (
select Year_CW,
sum(case when col = 0 then 1 else 0 end) as "Total_sampled(Checked)",
sum(case when col = 1 then 1 else 0 end) as "Total_unsampled(Not_Checked)",
sum(case when col = 0 AND col2 = 'accepted' then 1 else 0 end) as "Accepted",
sum(case when col = 0 AND col2 = 'accepted with comments' then 1 else 0 end)
as "Accepted with comments",
sum(case when col = 0 AND col2 = 'request for rework' then 1 else 0 end)
as "Request for rework",
sum(case when col = 0 AND col2 = 'rejected' then 1 else 0 end) as "Rejected"
from (
select Year_CW, SAMPLED as col, APPROVAL as col2
from View_TEST tv
) tv
group by Year_CW
)
order by Year_CW desc;
Внутренний запрос получает данные и вычисляет условные агрегатные значения.Внешний запрос просто получает эти значения из внутреннего запроса, а также добавляет столбец Total_DS
к результирующему набору, складывая вместе значения rwo из внутреннего запроса.
Как правило, следует избегать заключенных в кавычки идентификаторов.и, если они вам действительно нужны в наборе результатов, вы должны применить их в самый последний момент - поэтому используйте идентификаторы без кавычек во внутреннем запросе и присвойте им псевдонимы во внешнем запросе.И лично, если целью запроса является подсчет вещей, я предпочитаю использовать условный подсчет над условной суммой.Я также не уверен, почему у вас уже есть подзапрос к вашему представлению, который просто меняет имена столбцов и делает основной запрос немного более неясным.Поэтому я мог бы сделать это следующим образом:
select year_cw,
total_sampled_checked as "Total_sampled(Checked)",
total_unsampled_not_checked as "Total_unsampled(Not_Checked)",
accepted as "Accepted",
accepted_with_comments as "Accepted with comments",
request_for_rework as "Request for rework",
rejected as "Rejected",
total_sampled_checked + total_unsampled_not_checked as "Total_DS"
from (
select year_cw,
count(case when sampled = 0 then 1 end) as total_sampled_checked,
count(case when sampled = 1 then 1 end) as total_unsampled_not_checked,
count(case when sampled = 0 and approval = 'accepted' then 1 end) as accepted,
count(case when sampled = 0 and approval = 'accepted with comments' then 1 end)
as accepted_with_comments,
count(case when sampled = 0 and approval = 'request for rework' then 1 end)
as request_for_rework,
count(case when sampled = 0 and approval = 'rejected' then 1 end) as rejected
from view_test
group by year_cw
)
order by year_cw desc;
Обратите внимание, что в выражении case then 1
может быть then <anything that isn't null>
, так что вы можете сделать then sampled
или что-то еще.Я пропустил неявное else null
.* * * * * * * * * * * * * * * * Игнорирует все значения, * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Если выражение case игнорирует пустые значения, все, что должно делать выражение case, - это вычислять любое ненулевое значение для строк, которые вы хотите включить в счетчик.