2014-08-29 24 views
0

中選擇列我使用的請求得到列的集合名稱:從查詢

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE [...] 

從這個集合,我想數從原來的表中的每個不爲空,不爲空值按列名稱分組。

比方說,我有一個包含

COL1 | COL2 | COL3 
------------------ 
VAL1 | VAL2 | NULL 
VAL3 |  | VAL4 
VAL5 |  | 

我正在尋找一個請求,以獲得表:

COL1 | 3 
COL2 | 1 
COL2 | 1 

這對於分析的目的。

感謝您的幫助!

+0

您需要使用動態查詢:使用'INFORMATION_SCHEMA.COLUMNS'生成查詢表 – Serpiton 2014-08-29 10:31:58

+0

在這裏找到類似的東西http://www.sqlservercentral.com/Forums/Topic400832-392-1.aspx – mhn 2014-08-29 10:35:07

回答

1

這是一個簡單的過程。運行以下查詢:

SELECT 'SELECT ''' + COLUMN_NAME + ''', COUNT(['+COLUMN_NAME']) as NotNull FROM [' +SCHEMA_NAME+ '].['+TABLE_NAME+ '] union all ' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE [...] 

結果複製到一個查詢窗口,去掉最後union all,並運行該查詢。

+0

謝謝!它做得很好。 – 2014-08-29 11:39:21

0

下面的代碼似乎對您的問題

create table sample 
(
    col1 varchar(10), 
    col2 varchar(10), 
    col3 varchar(10) 
) 

INSERT INTO sample (COL1,COL2,COL3) VALUES ('VAL1 ',' VAL2 ',NULL); 
INSERT INTO sample (COL1,COL2,COL3) VALUES ('VAL3 ','  ',' VAL4'); 
INSERT INTO sample (COL1,COL2,COL3) VALUES ('VAL5 ','  ',' '); 
DECLARE @cols1 NVARCHAR(MAX); 
DECLARE @sql NVARCHAR(MAX); 

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

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




EXEC(@sql) 
0

Hereis工作,我的時間稍長就這個:

declare @cols table (colID integer, colName varchar(50)) 
declare @results table (colName nvarchar(50), valueCount bigint) 

-- table name 
declare @tableName nvarchar(50) = 'INSERT TABLE NAME HERE' 

-- select column names from table 
insert into @cols 
select column_id, name from sys.columns where object_id = object_id(@tableName) order by column_id 

declare @currentColID int = 0 
declare @currentName nvarchar(50) = '' 
declare @currentCount bigint = 0 
declare @sql nvarchar(max) -- where the dynamic sql will be stored 

-- go through all columns 
while (1 = 1) 
begin 
    -- step by id 
    select top 1 @currentColID = c.colID, @currentName = c.colName from @cols c 
    where c.colid > @currentColID order by c.colID 

    if @@ROWCOUNT = 0 break; 

    -- dynamic query to get non-empty, not-null counts 
    select @sql = 'select @p1=COUNT(' + @currentName + ') from ' + @tableName + 
       ' where ' + @currentName + ' is not null or LEN(' + @currentName + ') > 0' 

    exec sp_executesql @sql, N'@p1 bigint output', @p1 = @currentCount output  

    -- insert result to buffer   
    insert into @results values (@currentName, @currentCount)  
end 

-- print the buffer 
select * from @results 

玩得開心:)