一对多关系问题

tengdacom 2010-10-19 09:34:19
有二个表,一个是采购申请表,另一个是订货表,会存在一对多的关系,比如
采购申请表
申请单ID 名称 单位 数量
1 铜杆 吨 300
订货表
订货ID 申请单ID 名称 单位 申购数量 订货数量
1 1 铜杆 吨 300 50
2 1 铜杆 吨 300 100
3 1 铜杆 吨 300 150
现在我想要生成的新表结果是如下表,就是申购数量只显示在第一次订货,(存在一次申购对应多次订货的关系)
申请单号 名称 单位 申购数量 订货数量
1 铜杆 吨 300 50
1 铜杆 吨 100
1 铜杆 吨 150
请各位大侠帮帮忙
...全文
44 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dawugui 2010-10-19
create table 采购申请表(申请单ID int,名称 varchar(10),单位 varchar(10),数量 int)
insert into 采购申请表 values(1, '铜杆', '吨', 300)
insert into 采购申请表 values(2, '铝杆', '吨', 100)

create table 订货表(订货ID int,申请单ID int,名称 varchar(10),单位 varchar(10),申购数量 int,订货数量 int)
insert into 订货表 values(1 ,1 ,'铜杆', '吨', 300, 50)
insert into 订货表 values(2 ,1 ,'铜杆', '吨', 300, 100)
insert into 订货表 values(3 ,1 ,'铜杆', '吨', 300, 150)
go

select t1.申请单ID 申请单号 ,t1.名称 ,t1.单位 ,申购数量 =
(case when 订货ID = (select min(订货ID) from (select m.* , isnull(n.订货ID,1) 订货ID,n.订货数量 from 采购申请表 m left join 订货表 n on m.申请单ID = n.申请单ID) t2 where t2.申请单ID = t1.申请单ID) then ltrim(数量) else '' end)
,isnull(cast(t1.订货数量 as varchar),'') 订货数量
from (select m.* , isnull(n.订货ID,1) 订货ID,n.订货数量 from 采购申请表 m left join 订货表 n on m.申请单ID = n.申请单ID) t1

drop table 采购申请表,订货表

/*
申请单号 名称 单位 申购数量 订货数量
----------- ---------- ---------- ------------ ------------------------------
1 铜杆 吨 300 50
1 铜杆 吨 100
1 铜杆 吨 150
2 铝杆 吨 100

(所影响的行数为 4 行)

*/
回复
tengdacom 2010-10-19
有二个表,一个是采购申请表,另一个是订货表,会存在一对多的关系,比如
采购申请表
申请单ID 名称 单位 数量
1 铜杆 吨 300
2 铝杆 吨 100
订货表
订货ID 申请单ID 名称 单位 申购数量 订货数量
1 1 铜杆 吨 300 50
2 1 铜杆 吨 300 100
3 1 铜杆 吨 300 150

现在我想要生成的新表结果是如下表,就是申购数量只显示在第一次订货,(存在一次申购对应多次订货的关系)
申请单号 名称 单位 申购数量 订货数量
1 铜杆 吨 300 50
1 铜杆 吨 100
1 铜杆 吨 150
2 铝杆 吨 100
请各位大侠帮帮忙,还有一个铝杆目前还没有下订单,也要显示出来
回复
abuying 2010-10-19
LZ的表设计 有问题!

采购申请表
申请单ID 名称 单位 数量
订货表
订货ID 申请单ID 名称 单位 申购数量 订货数量
标注 不是采购申请表的内容吗?
其实只要
订货ID 申请单ID 订货数量
就行了吧!
回复
dawugui 2010-10-19
create table 订货表(订货ID int,申请单ID int,名称 varchar(10),单位 varchar(10),申购数量 int,订货数量 int)
insert into 订货表 values(1 ,1 ,'铜杆', '吨', 300, 50)
insert into 订货表 values(2 ,1 ,'铜杆', '吨', 300, 100)
insert into 订货表 values(3 ,1 ,'铜杆', '吨', 300, 150)
go

select m.申请单ID 申请单号 ,m.名称 ,m.单位 ,申购数量=
(case when 订货ID = (select min(订货ID) from 订货表 where 申请单ID = m.申请单ID) then ltrim(申购数量) else '' end)
,订货数量
from 订货表 m

drop table 订货表

/*
申请单号 名称 单位 申购数量 订货数量
----------- ---------- ---------- ------------ -----------
1 铜杆 吨 300 50
1 铜杆 吨 100
1 铜杆 吨 150

(所影响的行数为 3 行)
*/
回复
sgtzzc 2010-10-19
select 
申请单ID as 申请单号,
名称,
单位,
申购数量=case when px=1 then ltrim(申购数量) else '' end,
订货数量
from
(select *,px=row_number() over(partition by 申请单ID order by 订货ID) from 订货表) t
回复
dawugui 2010-10-19
select m.申请单号 ,m.名称 ,m.单位 ,m.申购数量,
(case when m.订货ID = (select min(订货ID) from 申请单ID = m.申请单ID) then ltrim(订货数量) else '' end) 订货数量
from 订货表 m
回复
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2010-10-19 09:34
社区公告
暂无公告