【问题标题】:Find count of null/empty records for all the columns查找所有列的空/空记录数
【发布时间】:2013-04-23 09:17:44
【问题描述】:

我有一张有 40 列的表格。

我希望编写一个查询,它将返回给我每列中的空值/空值的数量。

例子,

如果有 A、B、C 和 D 列。

我想要的输出是:

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

其中 3 是记录数: 其中 A 为空或 A = '' 等等……

任何帮助将不胜感激。 我正在使用 MS SQL 2008 R2

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    试试这个 -

    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
    

    更新:

    这种情况,试试动态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
    

    【讨论】:

    • 查询就像一个魅力,但我不必为我所有的 40 列编写 count() 语句吗?我正在寻找一种可以省去繁琐打字的方法!
    • 请给我 20 分钟。 :)
    • 太棒了!这很甜!非常感谢。不知何故,我知道动态 SQL 会有所帮助。但是世界一直在警告它,所以我克制自己。但这真的像瑞士刀一样有效!!很好的帮助!
    • 不客气@VivekTodi。提供的查询将允许您为具有任意数量的列的任何表生成所需的查询。
    【解决方案2】:

    试试这个

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      • 2014-06-19
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多