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

陈佳乐 2013-08-13 03:09:47
现在我要实现的 软件的功能是 有一个产品 要经过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
求大神们帮忙啊
...全文
564 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
陈佳乐 2013-08-14
  • 打赏
  • 举报
回复
结贴 给分 一人一半
Shawn 2013-08-13
  • 打赏
  • 举报
回复
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)
/*
id	A	B	C	D
123	1	1	1	1
*/
lzw_0736 2013-08-13
  • 打赏
  • 举报
回复

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)	
陈佳乐 2013-08-13
  • 打赏
  • 举报
回复
木有人顶 我自己定 顶 顶

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧