2013-04-23 1 views
3

40 개의 열이있는 테이블이 있습니다.모든 열에 대해 null/빈 레코드 수를 찾습니다.

나는 각 열의 null/empty 값의 수를 나에게 돌려 줄 질의를 작성하고 싶다.

열이 있으면

A, B, C 및 D.

원하는 내 출력된다 : 는이 3 레코드의 개수

A|B|C|D 
3|5|4|9 

null 또는 A = '' 등등 ...

도움이 될 것입니다. 내가 MS SQL 2008 R2

답변

6

이 하나의 시도 사용하고 있습니다 -

DECLARE @temp TABLE 
(
     A VARCHAR(50) 
    , B VARCHAR(50) 
    , C VARCHAR(50) 
    , D VARCHAR(50) 
) 

INSERT INTO @temp (A, B, C, D) 
VALUES 
    ('', 'dr', '1', NULL), 
    ('d', NULL, '45', 'h') 

SELECT 
    A = COUNT(CASE WHEN ISNULL(A, '') = '' THEN 1 END) 
    , B = COUNT(CASE WHEN ISNULL(B, '') = '' THEN 1 END) 
    , C = COUNT(CASE WHEN ISNULL(C, '') = '' THEN 1 END) 
    , D = COUNT(CASE WHEN ISNULL(D, '') = '' THEN 1 END) 
FROM @temp 

UPDATE :

이 경우를, 동적 SQL 시도 - 출력에서 ​​

DECLARE @TableName SYSNAME 
SELECT @TableName = 'dbo.test1' 

DECLARE @SQL NVARCHAR(MAX) 

SELECT @SQL = 'SELECT' + CHAR(13) + STUFF((
    SELECT CHAR(13) + ', ' + c.name + ' = COUNT(CASE WHEN ISNULL(CAST(' + c.name + ' AS NVARCHAR(MAX)), '''') = '''' THEN 1 END)' 
    FROM (
     SELECT o.[object_id] 
     FROM sys.objects o 
     JOIN sys.schemas s ON o.[schema_id] = s.[schema_id] 
     WHERE o.[type] = 'U' 
      AND s.name + '.' + o.name = @TableName 
    ) o 
    JOIN sys.columns c ON o.[object_id] = c.[object_id] 
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, ' ') + CHAR(13) + 'FROM ' + @TableName 

PRINT @SQL 

EXEC sys.sp_executesql @SQL 

당신 다음과 같은 것을 얻을 수 있습니다 :

SELECT 
    WorkOutID = COUNT(CASE WHEN ISNULL(CAST(WorkOutID AS NVARCHAR(MAX)), '') = '' THEN 1 END) 
, TimeSheetDate = COUNT(CASE WHEN ISNULL(CAST(TimeSheetDate AS NVARCHAR(MAX)), '') = '' THEN 1 END) 
, DateOut = COUNT(CASE WHEN ISNULL(CAST(DateOut AS NVARCHAR(MAX)), '') = '' THEN 1 END) 
, EmployeeID = COUNT(CASE WHEN ISNULL(CAST(EmployeeID AS NVARCHAR(MAX)), '') = '' THEN 1 END) 
, IsMainWorkPlace = COUNT(CASE WHEN ISNULL(CAST(IsMainWorkPlace AS NVARCHAR(MAX)), '') = '' THEN 1 END) 
, DepartmentUID = COUNT(CASE WHEN ISNULL(CAST(DepartmentUID AS NVARCHAR(MAX)), '') = '' THEN 1 END) 
, WorkPlaceUID = COUNT(CASE WHEN ISNULL(CAST(WorkPlaceUID AS NVARCHAR(MAX)), '') = '' THEN 1 END) 
, WorkShiftCD = COUNT(CASE WHEN ISNULL(CAST(WorkShiftCD AS NVARCHAR(MAX)), '') = '' THEN 1 END) 
, TeamUID = COUNT(CASE WHEN ISNULL(CAST(TeamUID AS NVARCHAR(MAX)), '') = '' THEN 1 END) 
, WorkHours = COUNT(CASE WHEN ISNULL(CAST(WorkHours AS NVARCHAR(MAX)), '') = '' THEN 1 END) 
, AbsenceCode = COUNT(CASE WHEN ISNULL(CAST(AbsenceCode AS NVARCHAR(MAX)), '') = '' THEN 1 END) 
, PaymentType = COUNT(CASE WHEN ISNULL(CAST(PaymentType AS NVARCHAR(MAX)), '') = '' THEN 1 END) 
FROM dbo.test1 

proff

+1

쿼리가 매력처럼 작동 시도하지만, 나는 카운트 내 모든 40 개 컬럼() 문을 작성해야하지 않을까요? 나는 성가신 타이핑을 구할 수있는 방법을 찾고 있었다. –

+0

제발 20 분주세요. :) – Devart

+0

업데이트 된 답변을 시도하십시오. – Devart

1

이 하나 개

DECLARE @cols1 NVARCHAR(MAX); 
DECLARE @sql NVARCHAR(MAX); 

SELECT @cols1 = STUFF((
    SELECT ', COUNT(CASE WHEN ISNULL(CONVERT(NVARCHAR(MAX), [' + t1.NAME + ']), '''') = '''' THEN 1 END) AS ' + t1.name 
    FROM sys.columns AS t1 
    WHERE t1.object_id = OBJECT_ID('myTable') 
    --ORDER BY ', COUNT([' + t1.name + ']) AS ' + t1.name 
    FOR XML PATH('') 
), 1, 2, ''); 

SET @sql = ' 
SELECT ' + @cols1 + ' 
FROM myTable 
' 

EXEC(@sql) 
관련 문제