2013-10-15 2 views
2

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

У меня есть таблица, как показано ниже

Id Name  SNumber 
100 XYZ  123 
100 XYZ  123 
101 ABC  123 
103 QAZ  123 
100 XYZ  971 
100 XYZ  872 
100 XYZ  659 
102 PQR  145 
102 PQR  707 
103 QAZ  421 

Я хочу подсчета строк, имеющих Snumber как «123» т.е. Всего столбцов и строк, имеющих Snumber не как «123», то есть otherTotal колонка

Id Name  Total OtherTotal 
100 XYZ  2   3 
101 ABC  1   0 
102 PQR  0   2 
103 QAZ  1   1 

То, что я делаю, используя присоединиться

Select xx.*,otherTotal 
From 
    (Select Id,Name,count(*) as Total 
     From table 
     Where Snumber like '123' 
     Group By id,name 
    )xx 

Inner join 

    (Select Id,Name,count(*) as otherTotal 
     From table 
     Where Snumber not like '123' 
     Group By id,name 
    )yy 

On xx.Id=yy.Id 

Но это будет возвращать только строки, если конкретный Id имеет как Snumber в 123, а не 123 вернулся

данных как ниже

Id Name  Total OtherTotal 
100 XYZ  2   3 
103 QAZ  1   1 

Теперь нет guarntee, что конкретный идентификатор всегда будет иметь Snumber, как 123, поэтому я не могу использовать Left или Right join. Как решить эту трясину? Giggity

ответ

4

Попробуйте это:

SELECT id, name, 
    COUNT(CASE WHEN SNumber = 123 THEN 1 END) Total, 
    COUNT(CASE WHEN SNumber <> 123 THEN 1 END) OtherTotal 
FROM t 
GROUP BY id, name 
ORDER BY id 

скрипку here.

3
select 
    Id, Name, 
    sum(case when SNumber = 123 then 1 else 0 end) as Total, 
    sum(case when SNumber <> 123 then 1 else 0 end) as OtherTotal 
from Table1 
group by Id, Name 
order by Id 

или

select 
    Id, Name, 
    count(*) - count(nullif(SNumber, 123)) as Total, 
    count(nullif(SNumber, 123)) as OtherTotal 
from Table1 
group by Id, Name 
order by Id 

sql fiddle demo

1

попробуйте этот.

DECLARE @TABLE TABLE (ID INT, NAME VARCHAR(40), SNUMBER INT) 
INSERT INTO @TABLE 
VALUES 
(100 ,'XYZ',  123), 
(100 ,'XYZ',  123), 
(101 ,'ABC',  123), 
(103 ,'QAZ',  123), 
(100 ,'XYZ',  971), 
(100 ,'XYZ',  872), 
(100 ,'XYZ',  659), 
(102 ,'PQR',  145), 
(102 ,'PQR',  707), 
(103 ,'QAZ',  421) 

SELECT 
    ID, 
    NAME, 
    (
     SELECT 
      COUNT(SNUMBER) FROM @TABLE B 
     WHERE 
      SNUMBER = '123' AND A.ID = B.ID 
    ) AS TOTAL, 
    (
     SELECT 
      COUNT(SNUMBER) FROM @TABLE B 
     WHERE 
      SNUMBER <> '123' AND A.ID = B.ID 
    ) AS OTHERTOTAL 
FROM 
    @TABLE A 
GROUP BY ID, NAME 
Смежные вопросы