Фильтрация в объединениях - PullRequest
0 голосов
/ 17 октября 2018

У меня есть две таблицы.

Таблица 1

 ----RID---Name-----
      1     Process1
      2     Process2

Таблица 2

  -----RID------URID-----Status-----
       1         1        0
       1         2        1
       1         3        3
       2         4        0

Я хочу подсчитать все ошибки (статус> 1), все успехи (статус <2) в таблице 2 длякаждое имя в таблице1.Например: </p>

 -----RID----Success------Errors---
       1        2            1
       2        1            0

Вот запрос, который я пытаюсь использовать, но он не работает ... Я подумал, что было бы разумно фильтровать уже в объединении .... Что я делаю неправильноВот ?

 select distinct T1.[Name]
 ,count(T2.URID) as Error
 ,count(T3.URID) as Success
 FROM [dbo].[Table 1] T1
 left join [dbo].[Table 2] T2
 on T2.RID = T1.RID and T2.Status > 1
 left join [dbo].[Table 2] T3
 on T3.RID = T1.RID and T3.Status < 2
 group by RID   

Ответы [ 4 ]

0 голосов
/ 17 октября 2018

это будет работать:

create table ns_999(col1 number,col2 number,col3 number);

 insert into ns_999 values( 1,1,0);
 insert into ns_999 values(1,2 ,1);
 insert into ns_999 values(1,3,3);
  insert into ns_999 values(2,4,0);
  SELECT * FROM ns_999;

  select col1,
       sum(case when col3>1 then 1 else 0 end ) as errors, 
       sum(case when col3<2 then 1 else 0 end) as sucess
from ns_999 
group by col1;

пример вывода:

 RID FALIURE SUCCESS 
    1      1       2
    2      0       1
0 голосов
/ 17 октября 2018

Использовать условное агрегирование:

select T1.[Name],
       sum(case when t2.status > 1 then 1 else 0 end) as errors,
       sum(case when t2.status < 2 then 1 else 0 end) as success
from [dbo].[Table 1] T1 left join
     [dbo].[Table 2] T2
     on T2.RID = T1.RID
group by T1.RID, T1.[Name];

Также важно агрегировать по столбцу, используемому для определения каждой строки T1.Name.Я не уверен, нужен ли T1.RID в group by, но он есть в вашей версии.

0 голосов
/ 17 октября 2018

Вы можете достичь этого, как показано ниже,

 SELECT * INTO #T FROM (SELECT CASE WHEN T.[STATUS]>1 THEN COUNT(T.[STATUS]) ELSE 0 END [ERROR],
 CASE WHEN T.[STATUS]<2 THEN COUNT(T.[STATUS]) ELSE 0 END [SUCCESS],
 T2.NAME FROM TEST1 T2 INNER JOIN TEST2 T ON T.RID=T2.RID
 GROUP BY T.[STATUS],T2.[NAME]) T


 SELECT NAME,SUM([SUCCESS]) [SUCCESS],SUM(ERROR)[ERROR] FROM #T GROUP BY NAME
0 голосов
/ 17 октября 2018

Вы можете выполнить агрегацию:

select  t1.rid, t1.name,
        sum(case when status > 1 then 1 else 0 end) as error, 
        sum(case when status < 2 then 1 else 0 end) as success 
from table1 t1 inner join
     table2 t2
     on t2.rid = t1.rid
group by t1.rid, t1.name

Однако, DISTINCT здесь не требуется, если у вас есть предложение GROUP BY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...