Среднее по определенному условию в числителе - PullRequest
1 голос
/ 21 июня 2019

У меня есть две таблицы WIP и ROS, в обеих таблицах есть много столбцов, но основными столбцами являются: Branch, Date, LC и, 'DN' и 'JCN' используются для объединения двух таблиц, и выходные данные должны быть в формате нижеВетвь, Дата, количество (* в зависимости от условия) / количество (*)

Как уже упоминалось, обе таблицы имеют много столбцов, но для моего запроса: WIP содержит столбцы Branch, Status, Date и DN, а ROS содержит Branch,Столбцы LC и JCN

Я использовал оператор case, как показано ниже:

select a.Branch,[Billed Date],avg(case when LC in 
('A22D','SB15','SB16','AT01','AT02','AT03') then 1.0 else 0 end)
from WIP a join ROS b on a.DN = b.JCN
where a.[Status] = 'BILLED' and SUBSTRING(a.DN,1,3) = 'XJC'
group by a.Branch,[Billed Date]
order by 1,2

Я пытаюсь получить результаты, используя соединения и коррелированный подзапрос, без использования оператора case

Я использовал приведенный ниже запрос, но получил неправильный результат.

 select a.Branch,[Billed Date], 
            1.0*(select count(*) from ROS where LC in ('A22D','SB15','SB16','AT01','AT02','AT03') and c.Branch = 
 a.Branch )/(select count(*) from ROS d where d.Branch = a.Branch)
 from WIP a join ROS b on a.DN = b.JCN
 where a.[Status] = 'BILLED' and SUBSTRING(a.DN,1,3) = 'XJC'
 order by 1,2

Я ожидаю, что результат будет:

 Branch     Date      Average_Jobs
   A     2019-06-01       0.11
   B     2019-06-01       0.09
   C     2019-06-01       0.12
   A     2019-06-02       0.12
   B     2019-06-02       0.10
   C     2019-06-02       0.13

Где средний столбец получен из числа LC, которыеA22D, SB15, SB16, AT01, AT02, AT03 и т. Д. Разделили общее количество LC для каждой ветви и каждого дня.

Я получаю ниже вывод с коррелированным подзапросом, я знаю, что все средние числа неверны:

Branch  Date        Avg
A   2019-06-01  0.032258065
A   2019-06-02  0.032258065
A   2019-06-03  0.032258065
A   2019-06-04  0.032258065
A   2019-06-05  0.032258065
A   2019-06-06  0.032258065
B   2019-06-01  0.032183908
B   2019-06-02  0.032183908
B   2019-06-03  0.032183908
B   2019-06-04  0.032183908
B   2019-06-05  0.032183908
B   2019-06-06  0.032183908
C   2019-06-01  0.032183908
C   2019-06-02  0.032183908
C   2019-06-03  0.032183908
C   2019-06-04  0.032183908
C   2019-06-05  0.032183908
C   2019-06-06  0.032183908

***** РЕДАКТИРОВАТЬ: мне нужно изменить запрос, поскольку он не дал мне правильных результатов при ручной проверке.Проблема состоит в том, что DN является первичным ключом, а JCN - внешним ключом, который содержит много дубликатов в столбце LC для EX:

 WIP Table           ROS Table
    DN             JCN        LC
    11A            11A        A21X
    12A            11A        SB15
     .             11A        AT09
     .             11A        A22A 
     .             12A        A22A
     .             12A        AT11  
                   12A        SB01  

Выходные данные моего запроса дают среднее значение 14,28%, поскольку из 7 строк,условие выполняется с помощью SB15 во втором ряду.В то время как то, что мне нужно в среднем, должно быть 50%.Это потому, что в столбце DN есть две записи: 11A и 12A, и только у одной из них есть LC, который нас интересует, т. Е. «SB15».Поэтому среднее значение составляет 1/2 = 0,5 от 50%.Я знаю, что мне нужно принимать значения DISTINCT для JCN или DN, чтобы получить правильный результат, я использовал DISTINCT, как показано ниже, но не получил правильный результат:

 select a.Branch,[Billed Date],avg(case when LC in 
 ('A22D','SB15','SB16','AT01','AT02','AT03') then 1.0 else 0 end)
 from WIP a join (select distinct JCN,LC from ROS) b on a.DN = b.JCN
 where a.[Status] = 'BILLED' and SUBSTRING(a.DN,1,3) = 'XJC'
 group by a.Branch,[Billed Date]
 order by 1,2    

Может кто-нибудь, пожалуйста, дайте мне знать, как это получить?

1 Ответ

0 голосов
/ 21 июня 2019
SELECT
  all_fields.*
FROM
  (
    SELECT
      Branch,
      MAX(Date)
    FROM
       yourtable
    GROUP BY
      Branch
   ) AS max_recs
LEFT OUTER JOIN yourtable AS all_fields ON max_recs.id = all_fields.id
...