导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

圣诞节本来是快乐的,可是巨难的问题使我”求生不得,求死不能“。急救......

duoduoqian 2003-12-25 09:33:19
表1 (所有的成品,成品ID是identity(1,1))
成品ID 成品中文名称
表2 (所有的料件,料件ID是identity(1,1))
料件ID 料件中文名称
表3 (每个成品所用到的料件)
成品ID 料件ID 料件的中文名称 损耗率

现在想建一个表4.
分组号 料件ID 料件的中文名称 损耗率1 损耗率2 损耗率3 损耗率4 损耗率5 损耗率6
也相当于:
成品ID 成品ID 成品ID 成品ID 成品ID 成品ID
分组号 料件ID 料件的中文名称 损耗率 损耗率 损耗率 损耗率 损耗率 损耗率


成品不止六个,分组号也就是用来把成品每六个一组。
如:成品有八个的话,那第一组是前六条记录,第二组就是只有后两条记录,也就是说在第二组只有损耗率1 损耗率2有记录了,其它的就没有数据。
不知道怎么做了,请各位大侠指点一二。

...全文
2 点赞 收藏 19
写回复
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
victorycyz 2003-12-26
我拿你贴出来的数据测试,结果正确。

另,你的要求中6种成品分一组是比较关键的,你最好拿6个以上的成品进行测试。
回复
victorycyz 2003-12-26
你的min只是显示了一部分吧。
---------------------------------
把结果集贴出来看看。
回复
sharplee82 2003-12-26
顶。
回复
ghosthjt 2003-12-25
以上的做法都是有局限性的,关键在于楼主的做法我觉得有点问题,为什么一定要控制在6组以内呢?以最大的组数作为列头不好吗?比如最大的一组是8则一直到损耗率8,不存在的为空,不是很好吗??


回复
sharplee82 2003-12-25
insert into test(lss_decp,groupid)
(select distinct table3.lss_decp from table3 where table3.cp_id between 1 and 6,1)应该知道我的意思了吧^_^,我是在插入字段值lss_decp的时候,顺便插入groupid的值为1如何写?
回复
qiaolin53 2003-12-25
呵呵,搂主的题目不过就是一个算法的问题,只要懂SQL的语法,写过代码,实际上没有什么难的。
不过我这里没有SQL server环境,虽然会做,但是没办法测试,执行起来很可能会报错,所以就不贴出来了,以免见笑。

楼下的这位也太懂节约了,呵呵,学习ing!
回复
txlicenhe 2003-12-25
insert into test(lss_decp) values(select distinct table3.lss_decp where table3.cp_id between 1 and 6)怎么会出错啊?

-->

insert into test(lss_decp)
select distinct table3.lss_decp where table3.cp_id between 1 and 6

楼上真会省啊
回复
sharplee82 2003-12-25
insert into test(lss_decp) values(select distinct table3.lss_decp where table3.cp_id between 1 and 6)怎么会出错啊?
回复
--是这个意思吧?

/*--假设有数据

科目 学生1_上学期 学生1_下学期 学生2_上学期 学生2_下学期 学生3_上学期 学生3_下学期 学生4_上学期 学生4_下学期 学生5_上学期 学生5_下学期
------ ------------ ----------- ----------- ------------ ------------ ------------ ------------ ----------- ------------ -----------
语文 80 90 30 69 87 65 60 60 87 65
数学 45 43 43 98 0 5 70 70 0 5


现要需要一个存储过程,输入每页的学生数目,得到结果,假设输入2,得到结果:
页号 科目 学生1_上学期 学生1_下学期 学生2_上学期 学生2_下学期
----------- ---------- ----------- ----------- ----------- -----------
0 语文 80 90 30 69
0 数学 45 43 43 98
1 语文 87 65 60 60
1 数学 0 5 70 70
2 语文 87 65 NULL NULL
2 数学 0 5 NULL NULL

(所影响的行数为 6 行)

--*/
create table 表A(科目 varchar(10)
,学生1_上学期 int,学生1_下学期 int
,学生2_上学期 int,学生2_下学期 int
,学生3_上学期 int,学生3_下学期 int
,学生4_上学期 int,学生4_下学期 int
,学生5_上学期 int,学生5_下学期 int)
insert into 表A
select '语文',80,90,30,69,87,65,60,60,87,65
union all select '数学',45,43,43,98,0,5,70,70,0,5
go

--处理的存储过程
create proc p_qry
@pagesize int --每页要显示的学生记录数
as
declare @s1 varchar(8000),@s2 varchar(8000),@s3 varchar(8000)
,@i int,@j int
select @s1='',@s2='',@s3=''

select gid=cast((colid-2)/@pagesize/2 as varchar),name into #t
from syscolumns
where object_id('表A')=id and name<>'科目' order by colid
set @j=@pagesize-((@@rowcount/2) % @pagesize)

select @s1=case @i when gid then @s1 else @s1+',@'+gid+' varchar(8000)' end
,@s2=@s2+case @i when gid then '' else ' from 表A'',@'+gid+'=''select 页号='+gid+',科目' end+',['+name+']'
,@s3=case @i when gid then @s3 else @s3+'+'' union all ''+@'+gid end
,@i=gid
from #t

while @j>0
select @s2=@s2+',null,null',@j=@j-1

select @s1=substring(@s1,2,8000)
,@s2=substring(@s2,11,8000)+' from 表A'''
,@s3='exec('+substring(@s3,16,8000)+')'

exec('declare '+@s1+'
select '+@s2+'
'+@s3)
go

--调用
exec p_qry 2
go

--测试测试环境
drop table 表A
drop proc p_qry
回复
victorycyz 2003-12-25
paste后,忘了改一下数值了。sorry:
select (成品id / 6) as 分组号,
a.料件ID,
b.料件的中文名称,
min(case when 成品ID=0 then 损耗率 end ) as 损耗率1,
min(case when 成品ID=1 then 损耗率 end ) as 损耗率2,
min(case when 成品ID=2 then 损耗率 end ) as 损耗率3,
min(case when 成品ID=3 then 损耗率 end ) as 损耗率4,
min(case when 成品ID=4 then 损耗率 end ) as 损耗率5,
min(case when 成品ID=5 then 损耗率 end ) as 损耗率6,
from table3 a join table2 b on a.料件ID=b.料件ID
group by (成品id / 6) , a.料件ID,b.料件的中文名称
回复
victorycyz 2003-12-25

是报关合同上的内容吧,建议成品ID和料件ID不用identity,用tinyint就行,并使ID号从0开始连续。你的表3不太完善。建议加一个主键字段id int identity(1,1)

表4不用.需要的时候查询生成就行。

以下是生成相当于表4的结果集的语句:

select (成品id / 6) as 分组号,
a.料件ID,
b.料件的中文名称,
min(case when 成品ID=0 then 损耗率 end ) as 损耗率1,
min(case when 成品ID=0 then 损耗率 end ) as 损耗率2,
min(case when 成品ID=0 then 损耗率 end ) as 损耗率3,
min(case when 成品ID=0 then 损耗率 end ) as 损耗率4,
min(case when 成品ID=0 then 损耗率 end ) as 损耗率5,
min(case when 成品ID=0 then 损耗率 end ) as 损耗率6,
from table3 a join table2 b on a.料件ID=b.料件ID
group by (成品id / 6) , a.料件ID,b.料件的中文名称
回复
qianduo 2003-12-25
好像是要使用游标吧。
可以把每个分组再建一个表,然后再插入到表4中去。
回复
hmzgz81 2003-12-25
看不懂!·!·!~!~!~!~
回复
sharplee82 2003-12-25
按照: victorycyz(中海,学SQL Server的菜鸟) 的写法:

select (cp_id / 6) as groupid,
a.lj_id,
b.lss_decp,
min(case when cp_id%6=0 then Isnull(loss_rt,0) end ) as loss_rt1,
min(case when cp_id%6=0 then qty end ) as qty1,
min(case when cp_id%6=1 then loss_rt end ) as loss_rt2,
min(case when cp_id%6=1 then qty end ) as qty2,
min(case when cp_id%6=2 then loss_rt end ) as loss_rt3,
min(case when cp_id%6=2 then qty end ) as qty3,

min(case when cp_id%6=3 then loss_rt end ) as loss_rt4,
min(case when cp_id%6=3 then qty end ) as qty4,
min(case when cp_id%6=4 then loss_rt end)as loss_rt5,
min(case when cp_id%6=4 then qty end ) as qty5,
min(case when cp_id%6=5 then loss_rt end ) as loss_rt6,
min(case when cp_id%6=5 then qty end ) as qty6,
@合同号 as lss_no into table4
from table3 a join table2 b on a.lj_id=b.lj_id
group by (cp_id / 6) , a.lj_id,b.lss_decp

例如: min(case when cp_id%6=1 then loss_rt end ) as loss_rt2,
对应上面的记录cp_id=1,用户的要求是所有cp_id=1的loss_rt,qty都要显示出来。
你的min只是显示了一部分吧。
回复
sharplee82 2003-12-25
loss_rt qty cp_id lj_id lss_decp

.00000 6.00000 1 1 单3电池/1.5V碱性电池
.00000 1.00000 1 2 9V电池/碱性电池
.00000 1.00000 1 3 4.8V蓄电池组
.00000 1.00000 1 6 配电器/充电用
.00000 51.00000 1 7 电容器/2000-8000只/KG/固定
.00000 68.00000 1 9 电阻/3000-9000个/KG/碳质电阻
.00000 8.00000 1 12 二极管
.00000 3.00000 1 14 IC/集成电路/单片
.00000 4.00000 1 15 马达(小型)小于10瓦/玩具用
.00000 11.00000 1 16 电感线圈
.00000 28.00000 1 17 三极管/小于1瓦
.00000 1.00000 1 18 晶体/晶振
.01500 .92600 1 20 ABS胶粒(新)
.00000 2.00000 1 21 线路板/单面空白/0.1-5G/块/1-30平方厘米(厚0.08-0.18cm)
.00000 1.00000 1 22 线路板/单面空白/5.1-15G/块/30.1-80平方厘米(厚0.08-0.18cm)
.03000 .00930 1 23 GP胶粒(新)
.03000 .04470 1 24 PC胶粒(新)
.03000 .03120 1 25 PE胶粒(新)
.03000 .04500 1 26 POM胶粒(新)
回复
ghosthjt 2003-12-25
victorycyz(中海)的方法可行吗,我怎么就觉得一点也不可行??
回复
victorycyz 2003-12-25
发现自己真的很粗心。还得再改一下:
select (成品id / 6) as 分组号,
a.料件ID,
b.料件的中文名称,
min(case when 成品ID % 6 =0 then 损耗率 end ) as 损耗率1,
min(case when 成品ID % 6 =1 then 损耗率 end ) as 损耗率2,
min(case when 成品ID % 6 =2 then 损耗率 end ) as 损耗率3,
min(case when 成品ID % 6 =3 then 损耗率 end ) as 损耗率4,
min(case when 成品ID % 6 =4 then 损耗率 end ) as 损耗率5,
min(case when 成品ID % 6 =5 then 损耗率 end ) as 损耗率6,
from table3 a join table2 b on a.料件ID=b.料件ID
group by (成品id / 6) , a.料件ID,b.料件的中文名称
回复
joygxd 2003-12-25
表1 (所有的成品,成品ID是identity(1,1))
成品ID 成品中文名称
表2 (所有的料件,料件ID是identity(1,1))
料件ID 料件中文名称
表3 (每个成品所用到的料件)
成品ID 料件ID 料件的中文名称 损耗率

==========================================

就可以了为何还要建表呢?
回复
duoduoqian 2003-12-25
呵呵。
我只是说比如有8个,真实的个数是不能确定的。他是由表1的个数来决定的。
也许有六十多个成品呢

其实我这个是用来做成报表的。没办法了只好把他做成一个表了。

:)
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告