SQL сумма двух условных агрегаций - PullRequest
0 голосов
/ 22 ноября 2018

Итак, вчера я узнал об условной агрегации.Я довольно новичок в SQL.

Вот мой запрос:

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",
    sum(case when col = 0 Or col = 1 then 1 else 0 end) as "Total_DS"
from 
    (select 
         Year_CW, SAMPLED as col, APPROVAL as col2 
     from 
         View_TEST tv) tv
group by 
    Year_CW 
order by 
    Year_CW desc

Я просто вычисляю некоторые KPI, сгруппированные по неделям.

Посмотрите на строку "Total_DS".По сути, это сумма первых двух сумм, «Total_sampled (Checked)» и «Total_unsampled (Not_Checked)».

Есть ли способ, которым я могу добавить два столбца из первых двух сумм, чтобы получить третью, вместо того, чтобы пытаться получить данные заново?Я чувствую, что производительность будет ужасной практикой.Для этой базы данных это не имеет значения, но я не хочу с самого начала изучать практику плохого кода.

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Вы, вероятно, не увидите значительного снижения производительности от того, что делаете сейчас, поскольку у вас уже есть все доступные данные, вы просто повторяете оценку случая.

Но вы не можете сослатьсяк псевдонимам столбцов для первых двух столбцов в пределах одного и того же уровня запроса.

Если вы не можете выполнить простой подсчет, как предложено @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, - это вычислять любое ненулевое значение для строк, которые вы хотите включить в счетчик.

0 голосов
/ 22 ноября 2018

Вы можете попробовать ниже

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",
       sum(sum(case when col = 0 then 1 else 0 end) = 0 Or sum(case when col = 1 then 1 else 0 end) = 1 then 1 else 0 end) as "Total_DS"

from (select Year_CW, SAMPLED as col, APPROVAL as col2 
      from View_TEST tv
     ) tv
group by Year_CW 
order by Year_CW desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...