2012-05-23 2 views
0

아래의 데이터를 사용하여 가능한 경우 하나의 SQL 쿼리로 모두 NULL 및 중복 레코드 수를보고하는 보고서를 생성해야합니다. 내가 별도로 SUM(CASE VAL WHEN NULL THEN 1 ELSE 0 END) AS NULLS 같은으로 널 (null)을 얻고, 중복 수SQL로 NULL 값과 전체 중복 항목 표시

NULLS | DUPLICATES 
--------------------- 
    2 | 1 

하지만, 가능하다면하지 하나로 쿼리 그래서 나는 알지도 못하는 : 같은

DES | VAL 
-------------- 
Tango | 32 
Zulu | [null] 
Golf | 12 
Golf | 12 
Bravo | [null] 

보고서는 보일 것이다.

답변

0

나는 두 가지 버전을 포함, 그래서 당신은 당신의 중복을 계산하는 방법을 확실하지 .

declare @T table 
(
    DES varchar(10), 
    VAL int 
) 

insert into @T values 
('Tango', 32), 
('Zulu', null), 
('Zulu', null), 
('Zulu', null), 
('Golf', 12), 
('Golf', 12), 
('Bravo', null) 

select sum(case when T.VAL is null then C end) as NULLS, 
     sum(case when T.C > 1 then C-1 end) as DUPLICATES1, 
     sum(case when T.C > 1 then 1 end) as DUPLICATES2 
from (
     select VAL, count(*) as C 
     from @T 
     group by DES, VAL 
    ) T 

결과 :

NULLS  DUPLICATES1 DUPLICATES2 
----------- ----------- ----------- 
4   3   2 
+0

은 완벽하게 작동한다. 대단히 감사합니다! – greener

0

당신이 그런 간단한 보고서에 결합하려는 스칼라 값을 반환이 선택을 잘한다면, 당신은 할 수 :

SELECT 
2 AS NULLS, 
DUPS 
FROM (SELECT 1 AS DUPS) D 

결과 :

NULLS  DUPS 
----------- ----------- 
2   1 

과 같이 두 가지 선택을 교체 필요합니다.

1
SELECT 
    (SELECT COUNT(*) FROM table_name WHERE val IS NULL) 
    AS NULLS, 
    (SELECT (COUNT(val) - COUNT(DISTINCT(val))) FROM table_name) 
    AS DUPLICATES 
+0

이 하나가 쉽게 읽을 수 있습니다. +1 –

+0

감사합니다. nulls 파트는 훌륭하게 작동하지만 중복 파트가 어떻게 작동하는지 완전히 이해하지 못합니다. 'val'열에서만 중복을 찾고 있습니까? – greener

+0

예. 여러 열의 'Distinct'는 더 복잡합니다 ([이 질문] (http://stackoverflow.com/questions/1471250/counting-distinct-over-multiple-columns) 참조). 나는 이것을 위해'COUNT (DISTINCT (CONCAT (des, val)))'를 사용할 것을 제안한다. –

0

당신이 원하는 당신이 중복 행을 계산하려는,이 가까이 올 수 있습니다 가정 (이?!) :

declare @Foo as Table (DES VarChar(10), VAL Int Null) 
insert into @Foo (DES, VAL) values 
    ('Tango', 32), 
    ('Zulu', NULL), 
    ('Golf', 12), ('Golf', 12), ('Golf', 13), 
    ('Bravo', NULL), 
    ('Whiskey', 8388), ('Whiskey', 8388), ('Whiskey', 8388), ('Whiskey', 8388) 

select * from @Foo 

select distinct DES, VAL from @Foo 

select (select Count(42) from @Foo where VAL is NULL) as [NULLS], 
    (select Count(42) from @Foo) - Count(42) as [DUPLICATES] from (select distinct DES, VAL from @Foo) as Elmer