2013-04-23 79 views
3

我有一個包含40列的表格。查找所有列的空/空記錄數

我希望編寫一個查詢,它將返回每列中空值/空值的數目。

實施例,

如果有列A,B,C和D.

我的期望的輸出是:

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

凡3是記錄數: 其中A是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列()語句?我正在尋找一種方法,可以爲我節省繁瑣的打字工作! – 2013-04-23 09:31:47

+0

請給我20分鐘。 :) – Devart 2013-04-23 09:36:09

+0

請嘗試更新答案。 – Devart 2013-04-23 09:46:11

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)