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
*/