我有数百个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中执行此操作?
答案 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
这使得一个字符串在执行时使用一个查询来创建一个只包含值的列的字符串。