2014-10-06 3 views
0

У меня есть данные следующим образом ....Group BY на основе Состояние

 
ColumnA ColumnB 
7675 22838 
7675 24907 
7675 NULL 

Я хочу, чтобы результаты в следующим образом .....

 
ColumnA ColumnB 
7675 2 (need total count for Not Null value) 
7675 0 (need count 0 for NULL value) 

ответ

0
select columnA, 
     count(columnB) as non_null_count, 
     sum(columnB is null) as null_count 
from your_table 
group by ColumnA 
+0

Мне нравится то, как вы отделяете нулевые и ненулевые числа в разных столбцах ... это не даст результата, запрошенного @jitendra, но, возможно, это лучший результат, чем тот, который он имел в виду. – evanv

3
SELECT ColumnA, COUNT(ColumnB) ColumnB 
FROM YourTable 
GROUP BY ColumnA 
UNION ALL 
SELECT ColumnA, 0 
FROM YourTable 
WHERE ColumnB IS NULL 
GROUP BY ColumnA 
+0

Зачем использовать союз вместо is/if null? – evanv

+1

@evanv Поскольку это не вернет набор результатов, который хочет op – Lamak

+0

Я не заметил, что значения столбца A были идентичны. Да, Ламак в точности прав. – evanv

0

вы можете легко сделать счет и сумму, которая может быть быстрее, если есть много строк, а не выбирать все строки дважды с помощью UNION

SELECT columna, columnb, SUM(mycount) 
FROM 
( SELECT *, COUNT(columnb) as mycount 
    FROM test 
    GROUP BY columnb 
)t 
GROUP BY mycount 
ORDER BY CASE WHEN mycount = 0 THEN 1 ELSE 2 END DESC; 

Fiddle Demo

1

Вы можете ввести вычисляемый столбец, указывающий ColumnB равна нулю или нет, и использовать его в качестве критерия группировки вместе с ColumnA:

SELECT 
    t.ColumnA, 
    ColumnB = COUNT(t.ColumnB) 
FROM 
    dbo.YourTable AS t 
CROSS APPLY 
    (SELECT CASE WHEN t.ColumnB IS NULL THEN 1 ELSE 0 END) AS x (SubGroup) 
GROUP BY 
    t.ColumnA, 
    x.SubGroup 
ORDER BY 
    t.ColumnA, 
    x.SubGroup 
; 

Выражение COUNT(t.ColumnB) всегда будет NULL для нулевой подгруппы, а для соответствующей непузырной подгруппы она вернет число ненулевых элементов.

Смежные вопросы