복붙노트

[SQL] 어떻게 하나 개의 레코드에 SQL에 널 (null) 값으로 모든 필드를 계산하려면?

SQL

어떻게 하나 개의 레코드에 SQL에 널 (null) 값으로 모든 필드를 계산하려면?

기본 키 열을 제외한 특정 레코드에 대한 널 (null) 값으로 모든 필드를 계산하는 방법은 없나요?

Example:

ID  Name    Age    City     Zip

1   Alex    32     Miami    NULL
2   NULL    24     NULL     NULL

출력으로 나는 명시 적으로 열 이름을 지정하지 않고 1과 3을 얻을 필요가있다.

해결법

  1. ==============================

    1.

    declare @T table
    (
      ID int,
      Name varchar(10),
      Age int,
      City varchar(10),
      Zip varchar(10)
    )  
    
    insert into @T values 
    (1, 'Alex', 32, 'Miami', NULL),
    (2,  NULL,  24,  NULL,   NULL)
    
    ;with xmlnamespaces('http://www.w3.org/2001/XMLSchema-instance' as ns)
    select ID,
           (
              select *
              from @T as T2
              where T1.ID = T2.ID
              for xml path('row'), elements xsinil, type 
           ).value('count(/row/*[@ns:nil = "true"])', 'int') as NullCount
    from @T as T1
    

    결과:

    ID          NullCount
    ----------- -----------
    1           1
    2           3
    

    최신 정보:

    여기에 더 나은 버전입니다. 마틴 스미스에게 감사드립니다.

    ;with xmlnamespaces('http://www.w3.org/2001/XMLSchema-instance' as ns)
    select ID,
           (
              select T1.*
              for xml path('row'), elements xsinil, type 
           ).value('count(/row/*[@ns:nil = "true"])', 'int') as NullCount
    from @T as T1
    

    최신 정보:

    그리고 조금 더 빠른 XQuery 표현식으로.

    ;with xmlnamespaces('http://www.w3.org/2001/XMLSchema-instance' as ns)
    select ID,
           (
              select T1.*
              for xml path('row'), elements xsinil, type 
           ).value('count(//*/@ns:nil)', 'int') as NullCount
    from @T as T1
    
  2. ==============================

    2.

    SELECT id,
      CASE WHEN Name IS NULL THEN 1 ELSE 0 END +
      CASE WHEN City IS NULL THEN 1 ELSE 0 END +
      CASE WHEN Zip  IS NULL THEN 1 ELSE 0 END
    FROM YourTable
    

    당신이 쿼리에서 명시 적으로 열 이름을 원하지 않는 경우, 동적 쿼리에 오신 것을 환영합니다

    DECLARE @sql NVARCHAR(MAX) = ''
    SELECT @sql = @sql + N'  CASE WHEN '+QUOTENAME(c.name)+N' IS NULL THEN 1 ELSE 0 END +'
    FROM sys.tables t
    JOIN sys.columns c
        ON t.object_id = c.object_id
    WHERE 
        c.is_nullable = 1
    AND t.object_id = OBJECT_ID('YourTableName')
    
    SET @sql = N'SELECT id, '+@sql +N'+0 AS Cnt FROM [YourTableName]'
    EXEC(@sql)
    
  3. ==============================

    3.이 문제를 해결해야한다 :

    이 문제를 해결해야한다 :

    select count (id) 
    where ( isnull(Name,"") = "" or isnull(City,"") = "" or isnull(Zip,"") = "" )
    

    아니 스마트 솔루션,하지만 일을해야한다.

  4. ==============================

    4.

    DECLARE @tempSQL nvarchar(max)
    SET @tempSQL = N'SELECT '
    
    SELECT @tempSQL = @tempSQL + 'sum(case when ' + cols.name + ' is null then 1 else 0 end) "Null Values for ' + cols.name + '",
                sum(case when ' + cols.name + ' is null then 0 else 1 end) "Non-Null Values for ' + cols.name + '",' FROM sys.columns cols WHERE cols.object_id = object_id('TABLE1');
    
    SET @tempSQL = SUBSTRING(@tempSQL, 1, LEN(@tempSQL) - 1) + ' FROM TABLE1;'
    
    EXEC sp_executesql @tempSQL  
    
  5. from https://stackoverflow.com/questions/9079037/how-to-count-in-sql-all-fields-with-null-values-in-one-record by cc-by-sa and MIT license