首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQL 查询某一起的值 返回不为空的列

2013-08-16 
SQL查询某一行的值 返回不为空的列现在我要实现的 软件的功能是 有一个产品 要经过15道工序 每道工序有相

SQL 查询某一行的值 返回不为空的列
现在我要实现的 软件的功能是 有一个产品 要经过15道工序 每道工序有相应的数据写入数据库 现在我要查询 该产品 已经经过了几道工序 并且 各历史工序的 信息
比如说   
  产品的ID  A  B  C   D   E      F     G   为列名 代表各个工序,当进行到工序D的时候 E F G均为NULL
     123    1  1  1   1  NULL  NULL   NULL
想要的查询结果是:
产品ID   A     B       C       D
123      1     1       1       1
求大神们帮忙啊 SQL???MFC?? SQL 数据库 软件 c++
[解决办法]


WITH a1 (ID,A,B,C,D,E,F,G) AS
(
 SELECT 123,1,1,1,1,NULL,NULL,NULL
)
,a2 AS
(
SELECT ID,'A' NAME,A VALUE FROM a1
UNION ALL
SELECT ID,'B',B FROM a1
UNION ALL
SELECT ID,'C',C FROM a1
UNION ALL
SELECT ID,'D',D FROM a1
UNION ALL
SELECT ID,'E',E FROM a1
UNION ALL
SELECT ID,'F',F FROM a1
UNION ALL
SELECT ID,'G',G FROM a1
)
SELECT * INTO #cu1 FROM a2 NAME WHERE VALUE IS NOT NULL

select distinct NAME into #cu2 from #cu1

declare @sql varchar(max),@sql2 varchar(max)
select @sql = isnull(@sql + '],[' , '') + NAME from #cu2
set @sql = '[' + @sql + ']'
select @sql2 = isnull(@sql2 + ',' , ',') + 'isnull(['+NAME+'],0) ['+NAME+']' from #cu2
set @sql='select ID'+@sql2+' from #cu1 a pivot (MAX(VALUE) for NAME in (' + @sql + ')) b order by ID'


exec (@sql)


[解决办法]
if OBJECT_ID('tempdb..#temp', 'u') is not null   drop table #temp;
CREATE TABLE #temp(id INT, A INT, B INT, C INT , D INT, E INT ,F INT, G INT)
insert #temp
select '123',1,1,1,1,NULL, NULL,NULL

DECLARE @fieldlist NVARCHAR(200), @sql NVARCHAR(MAX)
SET @fieldlist = STUFF(
(
SELECT (','+QUOTENAME(B.工序名称))
FROM #TEMP A
UNPIVOT
(值 FOR 工序名称 IN([A],[B],[C],[D],[E],[F],[G])) B--这儿楼主自己补齐了
FOR XML PATH('')
),1,1,''
)

SET @sql = N'
SELECT *
FROM #TEMP A
UNPIVOT
(值 FOR 工序名称 IN([A],[B],[C],[D],[E],[F],[G])) B--这儿楼主自己补齐了
PIVOT
(MAX(值) FOR 工序名称 IN('+ @fieldlist +')) C
'
--PRINT @sql
EXEC (@SQL)
/*
idABCD
1231111
*/

热点排行