表A (不定行数)
id 项目
1 a
2 b
3 c
4 d
5 e
6 f
7 g
表B
体检编号 项目 结果
200607220001 a 正常
200607220001 b 正常
200607220001 c 不正常
200607220002 a 不正常
200607220002 b 正常
200607220002 f 正常
200607220002 g 正常我要的最后结果
体检编号 a b c d e f g
200607220001 正常 正常 不正常 null null null null
200607220002 不正常 正常 null null null 正常 正常
id 项目
1 a
2 b
3 c
4 d
5 e
6 f
7 g
表B
体检编号 项目 结果
200607220001 a 正常
200607220001 b 正常
200607220001 c 不正常
200607220002 a 不正常
200607220002 b 正常
200607220002 f 正常
200607220002 g 正常我要的最后结果
体检编号 a b c d e f g
200607220001 正常 正常 不正常 null null null null
200607220002 不正常 正常 null null null 正常 正常
解决方案 »
- SqlServer2008复制数据库,选择不了“数据库”
- 安装了SQL Server2008为什么没有2000时的右下角图标了?
- 100分请教一个SQL问题
- 添加check时,如何用sql语句实现 取消“检查现有数据”属性项
- 一个sql转换的问题,很急,再线等!
- 求一条SQl语句
- select convert(text,content) as content from...数据少取了
- 请教一个SQL语句的写法
- window server2003企业版的操作系统,安装SQL SERVER2003的数据库怎么不好用啊,听说要装什么插件的,那位大哥知道帮小弟一把!!!!!
- 如何查询某年某月的记录?
- auto-increment键能归零吗?
- 日期与周的计算
set @sql = 'select 体检编号'
select @sql = @sql + ',(case 项目 when '''+项目+''' then 结果 else NULL end) ['+项目+']'
from (select distinct 项目 from 表B) as aselect @sql = @sql+' from 表B '
exec(@sql)
set @sql = 'select 体检编号'
select @sql = @sql + ',(case 项目 when '''+项目+''' then 结果 else NULL end) ['+项目+']'
from (select distinct 项目 from 表A) as a--should be Table A hereselect @sql = @sql+' from 表B '
exec(@sql)
set @sql = 'select 体检编号'
select @sql = @sql + ',max(case 项目 when '''+项目+''' then 结果 else NULL end) ['+项目+']'
from (select distinct 项目 from 表A) as a--should be Table A hereselect @sql = @sql+' from 表B '
exec(@sql)
Declare @sql varchar(8000)
set @sql = 'select 体检编号'
select @sql = @sql + ',max(case 项目 when '''+项目+''' then 结果 else NULL end) ['+项目+']'
from (select distinct 项目 from 表A) as a--should be Table A hereselect @sql = @sql+' from 表B group by 体检编号' '
exec(@sql)
set @sql = 'select distinct 体检编号'
select @sql = @sql + ',(select 结果 from B bb where bb.项目='''+A.项目+''' and bb.体检编号=B.体检编号) ['+项目+']'
from A
select @sql = @sql+' from 表B '
exec(@sql)
if exists(select * from sysobjects where name='表B' and xtype='U') drop table 表B
--生成测试用数据,为SELECT初始环境
CREATE TABLE 表A(id int ,项目 varchar(10))
INSERT INTO 表A SELECT 1,'a'
UNION ALL SELECT 2,'b'
UNION ALL SELECT 3,'c'
UNION ALL SELECT 4,'d'
UNION ALL SELECT 5,'e'
UNION ALL SELECT 6,'f'
UNION ALL SELECT 7,'g'
CREATE TABLE 表B(体检编号 Varchar(20),项目 Varchar(10),结果 Varchar(10))
INSERT INTO 表B SELECT '200607220001','a','正常'
UNION ALL SELECT '200607220001', 'b','正常'
UNION ALL SELECT '200607220001', 'c','不正常'
UNION ALL SELECT '200607220002', 'a','不正常'
UNION ALL SELECT '200607220002', 'b','正常'
UNION ALL SELECT '200607220002', 'f','正常'
UNION ALL SELECT '200607220002', 'g','正常'
select * from 表A
select * from 表B
SElECT 项目 FROM 表A
GO
--此处为用来查询的SELECT语句Declare @Sql Varchar(8000)
SET @Sql='SELECT 体检编号'
SELECT @Sql=@Sql+','+项目+'=MAX(Case 项目 WHEN '''+项目+''' THEN 结果 ELSE NULL END)' FROM 表A
SELECT @SQL
EXEC (@Sql+ ' from 表B GROUP BY 体检编号')
GO
--删除测试散数据
DROP TABLE 表A,表B/* -- 结果 --
体检编号 a b c d e f g
-------------------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
200607220001 正常 正常 不正常 NULL NULL NULL NULL
200607220002 不正常 正常 NULL NULL NULL 正常 正常*/ -- 完成 --慢了点儿,还是贴出来...晕晕啊。