请教:用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.
这样结果的查询语句该如何写?谢谢!
...全文
127 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
  • 打赏
  • 举报
回复
写个函数.

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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