40 개의 열이있는 테이블이 있습니다.모든 열에 대해 null/빈 레코드 수를 찾습니다.
나는 각 열의 null/empty 값의 수를 나에게 돌려 줄 질의를 작성하고 싶다.
예
열이 있으면
A, B, C 및 D.원하는 내 출력된다 : 는이 3 레코드의 개수
A|B|C|D
3|5|4|9
null 또는 A = '' 등등 ...
도움이 될 것입니다. 내가 MS SQL 2008 R2
40 개의 열이있는 테이블이 있습니다.모든 열에 대해 null/빈 레코드 수를 찾습니다.
나는 각 열의 null/empty 값의 수를 나에게 돌려 줄 질의를 작성하고 싶다.
예
열이 있으면
A, B, C 및 D.원하는 내 출력된다 : 는이 3 레코드의 개수
A|B|C|D
3|5|4|9
null 또는 A = '' 등등 ...
도움이 될 것입니다. 내가 MS SQL 2008 R2
이 하나의 시도 사용하고 있습니다 -
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
이 하나 개
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)
쿼리가 매력처럼 작동 시도하지만, 나는 카운트 내 모든 40 개 컬럼() 문을 작성해야하지 않을까요? 나는 성가신 타이핑을 구할 수있는 방법을 찾고 있었다. –
제발 20 분주세요. :) – Devart
업데이트 된 답변을 시도하십시오. – Devart