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