请教:用sql语句查询家庭表问题

aloie 2008-03-23 03:56:40
(员工)家庭表如下:
家庭编号 姓名 关系 (00本人,01、02配偶,03、04子女,同一家庭的成员家庭编号一样,比如A/B/C是一个家庭)
0001 A 00
0001 B 02
0001 C 03
0002 D 00
0003 E 00
0003 F 03
0003 G 04
要得出如下的查询结果:
家庭编号 员工名 配偶名 子女名
0001 A B C
0002 N/A N/A N/A
0003 E N/A F
0003 E N/A G

提示,这里要考虑到员工的如下情况:1单身,2有配偶无子女,3无配偶有子女,4有配偶有子女,5子女可能是多个,比如例子中的员工E.
这样结果的查询语句该如何写?谢谢!
...全文
76 点赞 收藏 15
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
aloie 2008-03-23
Limpire 强!
回复
Limpire 2008-03-23
这个应该是在前台逻辑控制填什么的了,这种做法无可厚非。
回复
Limpire 2008-03-23
这点我倒没什么异议,本人是男的配偶02,本人是女的配偶01,反之亦可。
回复
dawugui 2008-03-23
[Quote=引用楼主 aloie 的帖子:]
(员工)家庭表如下:
家庭编号 姓名 关系 (00本人,01、02配偶,03、04子女,同一家庭的成员家庭编号一样,比如A/B/C是一个家庭)
0001 A 00
0001 B 02
0001 C 03
0002 D 00
0003 E 00
0003 F 03
0003 G 04
要得出如下的查询结果:
家庭编号 员工名 配偶名 子女名
0001 A B C
0002 N/A…
[/Quote]

00本人,01、02配偶?

两配偶?

回复
Limpire 2008-03-23
select 
a.家庭编号,
a.员工名,
配偶名=isnull(b.员工名, 'N/A'),
子女名=isnull(c.员工名, 'N/A')
from #T a
left join #T b on a.家庭编号=b.家庭编号 and b.关系 in ('01','02')
left join #T c on a.家庭编号=c.家庭编号 and c.关系 in ('03','04')
where a.关系='00'
回复
Limpire 2008-03-23
[Quote=引用 8 楼 JiangHongTao 的回复:]
在没弄清楚上面的问题之前,所有的连接都是多余的。

[/Quote]

01夫02妻
03子04女
回复
dawugui 2008-03-23
没看懂,帮顶.
回复
JiangHongTao 2008-03-23
在没弄清楚上面的问题之前,所有的连接都是多余的。
回复
JiangHongTao 2008-03-23
[Quote=引用楼主 aloie 的帖子:]
(员工)家庭表如下:
家庭编号 姓名 关系 (00本人,01、02配偶,03、04子女,同一家庭的成员家庭编号一样,比如A/B/C是一个家庭)
0001 A 00
0001 B 02
0001 C 03
0002 D 00
0003 E 00
0003 F 03
0003 G 04
要得出如下的查询结果:
家庭编号 员工名 配偶名 子女名
0001 A B C
0002 N/A…
[/Quote]
---------------------------------------------
01、02配偶 ,现在还允许一夫(妇)多妻(夫) 吗?
03、04难道不可以有3个子女吗?
回复
cxmcxm 2008-03-23

--将其分解为三个独立的表,员工表,配偶表,子女表,再用左连接

select a.家庭编号,a.姓名 员工名,b.姓名 配偶名,c.姓名 子女名
from 家庭表 a left join 家庭表 b on a.关系='00' and b.关系 in ('01','02') and a.家庭编号=b.家庭编号
left join 家庭表 c on c.关系 in ('03','04') and a.家庭编号=c.家庭编号
回复
Limpire 2008-03-23
--> 测试数据: #T
if object_id('tempdb.dbo.#T') is not null drop table #T
create table #T (家庭编号 varchar(10),员工名 varchar(10),关系 varchar(2))
insert into #T
select '0001','A','00' union all
select '0001','B','02' union all
select '0001','C','03' union all
select '0002','D','00' union all
select '0003','E','00' union all
select '0003','F','03' union all
select '0003','G','04'

select
a.家庭编号,
a.员工名,
配偶名=isnull(b.员工名, 'N/A'),
子女名=isnull(c.员工名, 'N/A')
from #T a
left join #T b on a.家庭编号=b.家庭编号 and b.关系='02'
left join #T c on a.家庭编号=c.家庭编号 and c.关系 in ('03','04')
where a.关系='00'


/*
家庭编号 员工名 配偶名 子女名
---------- ---------- ---------- ----------
0001 A B C
0002 D N/A N/A
0003 E N/A F
0003 E N/A G
*/
回复
aloie 2008-03-23
同一个家庭的要在一行记录上,如果是多子女,才放在多行上(放在一行也可)
回复
hlq8210 2008-03-23

写错了,多了一个,
select distinct 家庭编号, case 关系 when '00'then 姓名 else null end as 员工姓名,
case when 关系='01' or 关系= '02' then 姓名 else null end as 配偶名,
case when 关系='03' or 关系= '04' then 姓名 else null end as 子女名,
from tablename

回复
hlq8210 2008-03-23

select distinct,家庭编号, case 关系 when '00'then 姓名 else null end as 员工姓名,
case when 关系='01' or 关系= '02' then 姓名 else null end as 配偶名,
case when 关系='03' or 关系= '04' then 姓名 else null end as 子女名,
from tablename
回复
liangCK 2008-03-23
写个函数.
回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-03-23 03:56
社区公告
暂无公告