删除空值以压缩表

时间:2014-01-03 04:07:29

标签: sql sql-server database

我有数百个col的桌子。从col1到col150 ..大多数值都为null。

我需要能够摆脱所有空值并压缩表格。 我该怎么做?

以下是表格的示例

   am_525384-010        NULL    NULL    47.00   50.00   NULL    NULL    NULL    NULL    NULL    NULL    
   am_487679-100        NULL    NULL    NULL    NULL    NULL    98.001  98.00   NULL    NULL    NULL        
   am_454251-090        NULL    NULL    50.00   NULL    NULL    NULL    NULL    NULL    NULL    NULL    
   am_443915-050        NULL    58.00   NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    
   am_555440-060        NULL    NULL    50.00   NULL    45.00   NULL    NULL    59.00   NULL    NULL    
   am_354701-412        NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    
   am_431998-016        NULL    NULL    NULL    NULL    NULL    NULL    40.00   NULL    NULL    NULL    
   am_511441-172        NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    

这就是我希望它看起来像

       am_525384-010        47.00   50.00   NULL        
       am_487679-100        98.01   98.00   NULL            
       am_454251-090        50.00   NULL    NULL
       am_443915-050        58.00   NULL    NULL    
       am_555440-060        50.00   45.00   59.00       
       am_354701-412        NULL    NULL    NULL   
       am_431998-016        40.00   NULL    NULL    
       am_511441-172        NULL    NULL    NULL    

我如何在MSSQL中执行此操作?

2 个答案:

答案 0 :(得分:2)

第一次UNPIVOT

Select id, colnam, colval
into unpivoted
From (Select * FROM table) AS t
UNPIVOT (colval for colnam in (col1, col2, ...)) as u

这会将您的示例数据转换为类似

的内容
id             colnam colval
am_525384-010  col3   47.00
am_525384-010  col4   50.00
am_487679-100  col6   98.001
am_487679-100  col7   98.00
...

然后找到发现的不同colnams并使用它来生成一个选择以将其反转回来

declare @s nvarchar(4000);
set @s = "";
select @s=@s+',['+colnam+']' from (select distinct colnam from unpivoted) x
set @s='select * from unpivoted pivot (sum(colval) for colnam in ('+substring(@s,2,len(@s)-1)+')) as p';

将生成一个pivot select以将其放回列中,如下所示:

Select * FROM Unpivoted
PIVOT (SUM(colval) for colnam in ([col2],[col3],[col4],...)) as p

答案 1 :(得分:0)

另一种选择是创建一个脚本,确定要在查询中包含哪些列,并使用它来创建一个可以执行的选择的字符串。

declare @s nvarchar(4000)
set @s='declare @x nvarchar(4000); select @x=''select id'''
select @s=@s+'+case when count(['+name+'])>0 then '',['+name+']'' else '''' end' from sys.columns where object_id=OBJECT_ID('table') and name like 'col%'
set @s=@s+'+'' from table'' from table; exec sp_executesql @x'
exec sp_executesql @s

这使得一个字符串在执行时使用一个查询来创建一个只包含值的列的字符串。