建立环境
declare @tb1 table
(
[产品类别] varchar(10),
[产品编号] varchar(10)
)
insert @tb1
select 'A','A1' union
select 'A','A2' union
select 'A','A3' union
select 'A','A4' union
select 'A','A5' union
select 'B','B1' union
select 'B','B2' union
select 'B','B3' union
select 'B','B4' union
select 'B','B5'select * from @tb1declare @tb2 table
(
[出货单号] varchar(10),
[产品类别] varchar(10),
[数量] varchar(10)
)
insert @tb2
select '1','A','3' union
select '1','B','2' select * from @tb2
declare @tb1 table
(
[产品类别] varchar(10),
[产品编号] varchar(10)
)
insert @tb1
select 'A','A1' union
select 'A','A2' union
select 'A','A3' union
select 'A','A4' union
select 'A','A5' union
select 'B','B1' union
select 'B','B2' union
select 'B','B3' union
select 'B','B4' union
select 'B','B5'select * from @tb1declare @tb2 table
(
[出货单号] varchar(10),
[产品类别] varchar(10),
[数量] varchar(10)
)
insert @tb2
select '1','A','3' union
select '1','B','2' select * from @tb2
解决方案 »
- 就是有段.sql的脚本文件。想直接调用这个文件 创建数据库。怎么实现
- WINDOWS XP下如何安装SQL SERVER2000
- 游标改为WHILE语句求助!!!在线等!
- SET IDENTITY_INSERT XXX ON 的有效范围问题
- 存储过程中like的使用,急,解决马上结
- 请教:如果update触发器被触发后执行一条update自己的语句,请问还能再次触发吗?请问该怎么样才能做到这点
- 请问这样的语句Oracle支持吗?
- 我仅有.mdf和.ldf文件,如何进行数据库恢复。解决就加分!
- 为什么在SQL Server里打上如下的语句,她不执行?只是说查询了记录了;
- 这样的sql语句怎么写?
- sqlserver 运行一段时间后会自动停止?
- 如何将远程服务器的数据库备份到本地机器上?
create table 产品表(产品类别 char(1),产品编号 char(2))
insert into 产品表 select 'A','A1'
insert into 产品表 select 'A','A2'
insert into 产品表 select 'A','A3'
insert into 产品表 select 'A','A4'
insert into 产品表 select 'A','A5'
insert into 产品表 select 'B','B1'
insert into 产品表 select 'B','B2'
insert into 产品表 select 'B','B3'
insert into 产品表 select 'B','B4'
insert into 产品表 select 'B','B5'create table 出货表(出货单号 int,产品类别 char(1),数量 int)
insert into 出货表 select 1,'A',3
insert into 出货表 select 1,'B',2--执行查询
select
a.出货单号,
b.产品编号
from
出货表 a,
产品表 b
where
a.产品类别 = b.产品类别
and
(select count(*) from 产品表 c where 产品类别=a.产品类别 and 产品编号>=b.产品编号)<=a.数量--输出结果
出货单号 产品编号
-------- --------
1 A1
1 A2
1 A3
1 B1
1 B2
(
[产品类别] varchar(10),
[产品编号] varchar(10)
)
create table [出货表]
(
[出货单号] int,
[产品类别] varchar(10),
[数量] int
)
insert [产品表]
select 'A','A1' union
select 'A','A2' union
select 'A','A3' union
select 'A','A4' union
select 'A','A5' union
select 'B','B1' union
select 'B','B2' union
select 'B','B3' union
select 'B','B4' union
select 'B','B5'
insert [出货表]
select 1,'A',3 union
select 1,'B',2--测试
declare @sql varchar(5000)
set @sql=''
select @sql=@sql+' union all select top '+convert(varchar,[数量])+' * from [产品表] where [产品类别]='''+[产品类别]+''''
from [出货表]
set @sql=stuff(@sql,1,10,'')
--print @sql
exec(@sql)--删除测试环境
drop table [产品表],[出货表]--结果
/*
产品类别 产品编号
---------- ----------
A A1
A A2
A A3
B B1
B B2
*/
declare @lb varchar(5)
declare @sl int
declare @tmp int
DECLARE cur_ck CURSOR FOR select 产品类别,数量 FROM 出货表 WHERE 出货单号 = '1'
OPEN cur_ck
FETCH NEXT FROM cur_ck INTO @lb,@sl
set @tmp = 0
WHILE @@FETCH_STATUS = 0
BEGIN
if (@tmp = 0)
begin
set @sql = 'select top ' + cast(@sl as varchar(5)) + ' ' + cast(@sl as varchar(5)) + ' 出货单号,产品编号 from 产品表 a where a.产品类别 = ''' + @lb + ''''
set @tmp = 1
end
else
begin
set @sql = ' UNION select top ' + cast(@sl as varchar(5)) + ' ' + cast(@sl as varchar(5)) + ' 出货单号,产品编号 from 产品表 a where a.产品类别 = ''' + @lb + ''''
end
FETCH NEXT FROM cur_ck INTO @lb,@sl
endexec(@sql)
没测试,你试一下,主要思路是用游标取出货表中的单号为指定号码的数据,动态生成select语句,用exec方法执行
declare @sql varchar(5000)
declare @bb varchar(5)
set @sql=''
select @bb=[出货单号], @sql=@sql+' union all select top '+convert(varchar,[数量])+' '+@bb+' 出货单号,[产品编号] from [产品表] where [产品类别]='''+[产品类别]+''''
from [出货表] a where [出货单号] = '1'
set @sql=stuff(@sql,1,10,'')
--print @sql
exec(@sql)