Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 删除空值以压缩表_Sql_Sql Server_Database - Fatal编程技术网

Sql 删除空值以压缩表

Sql 删除空值以压缩表,sql,sql-server,database,Sql,Sql Server,Database,我有一张从col1到col150的数百列的桌子。。大多数值都是空的 我需要能够去除所有的空值,并压缩表格。 我该怎么做 下面是该表的一个示例 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

我有一张从col1到col150的数百列的桌子。。大多数值都是空的

我需要能够去除所有的空值,并压缩表格。 我该怎么做

下面是该表的一个示例

   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中如何执行此操作?

首先取消PIVOT

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
...
然后获取找到的不同colnam,并使用它生成一个select来将其转回来

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';
这将生成一个轴心选择,将其放回列中,如下所示:

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

另一个选项是生成一个脚本,确定查询中要包含哪些列,并使用该脚本生成一个字符串,该字符串是可以执行的select

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

这将生成一个字符串,当执行该字符串时,该字符串使用一个查询来生成一个仅包含具有值的列的select字符串。

这里的确切逻辑是什么?您最好通过一次性取消激活表来更改架构,这样您就再也不会出现此问题。pivot可能无法工作。有数千行或多行…您应该转换此表到Sparxmatrix,然后使用Sparxmatrix.SQL Server对这种情况的查询。您能试着向我解释一下这是如何工作的吗?
all
在这方面做了什么?
count(columnname)