标题:[求助]请帮我看看
只看楼主
lengxie
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-10-27
 问题点数:0 回复次数:11 
[求助]请帮我看看

有一个表a记录如下所示
BASE_WO DEPT_NAME QTY_BACKLOG
000004 包装 77622
000005 包装 77426
000006 PSA 1606
000006 包装 9652
000107 PSA 2160
000107 包装 32586
000107 字符 674
000107 湿菲林 46

现建一表b如下结构
BASE_WO DEPT1 DEPT2 DEPT3 DEPT4 DEPT5 QTY1 QTY2 QTY3 QTY4 QTY5


由于相同的BASE_wo不会超过5个所以才设计如上表
DEPT----QTY对应

现在要设计一个存储过程得到如下结果
BASE_WO DEPT1 DEPT2 DEPT3 DEPT4 DEPT5 QTY1 QTY2 QTY3 QTY4 QTY5
000004 包装 0 0 0 0 77622 0 0 0 0
000005 包装 0 0 0 0 77426 0 0 0 0
000006 PSA 包装 0 0 0 1606 9652 0 0 0
000107 PSA 包装 字符 湿菲林 0 2160 32586 674 46 0


[此贴子已经被作者于2007-2-6 11:52:42编辑过]

搜索更多相关主题的帖子: 包装 000006 
2007-02-06 11:36
Kendy123456
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:62
帖 子:2720
专家分:0
注 册:2007-1-3
得分:0 

不好意思...前面没看清.

[此贴子已经被作者于2007-2-6 11:40:14编辑过]


2007-02-06 11:39
lengxie
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-10-27
得分:0 
BASE_WO DEPT1 DEPT2 DEPT3 DEPT4 DEPT5 QTY1 QTY2 QTY3 QTY4 QTY5
000004 包装 0 0 0 0 77622 0 0 0 0
000005 包装 0 0 0 0 77426 0 0 0 0
000006 PSA 包装 0 0 0 1606 9652 0 0 0
000107 PSA 包装 字符 湿菲林 0 2160 32586 674 46 0
现在可以不?
2007-02-06 11:43
Kendy123456
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:62
帖 子:2720
专家分:0
注 册:2007-1-3
得分:0 
看看论坛关于行列转换的贴 很多的了

2007-02-06 11:44
lengxie
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-10-27
得分:0 
以下是引用Kendy123456在2007-2-6 11:44:26的发言:
看看论坛关于行列转换的贴 很多的了

这个不一样的啊!!我发出来的只是一个小部分,DEPT有48种可能,但同时出现的最多只有5个部门也就是说是动态的,表b是做好的,现在就是要把A的数据放在B里面

2007-02-06 11:51
lengxie
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-10-27
得分:0 
不知道说清楚没有???其实就是一个工厂的生产流程,一个工单在哪个部门生产的部门名称和数量。现在要把A表的记录放进B表,DEPT---QTY是对应的,如果现在一个工单只有一个部门在生产那就如上结果的第一条记录
2007-02-06 11:58
Kendy123456
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:62
帖 子:2720
专家分:0
注 册:2007-1-3
得分:0 

要实现是不难的,
把表按照Base WO排序 然后建立一个游标
放一个计数变量, 一个标识变量

Declare Cur1 Cursor For
Select * from 表A order by Base_WO
Open Cur1

FETCH NEXT FROM Cur1 INTO @No, @Dep, @Qty

Insert into 表b (BaseWo,Dept1,qty1) values @No, @Dep, @Qty

Set @cnt = -1
set @Base_WO_Main = No

WHILE @@FETCH_STATUS = 0
begin
if @Base_WO_Main = @No
begin
if @cnt <> -1
begin
if @cnt = 0
Insert into 表b (BaseWo,Dept1,qty1) values @No, @Dep, @Qty
if @cnt = 1
Insert into 表b (BaseWo,Dept2,qty2) values @No, @Dep, @Qty
if @cnt = 2
Insert into 表b (BaseWo,Dept3,qty3) values @No, @Dep, @Qty
if @cnt = 3
Insert into 表b (BaseWo,Dept4,qty4) values @No, @Dep, @Qty
if @cnt = 4
Insert into 表b (BaseWo,Dept5,qty5) values @No, @Dep, @Qty

set @cnt = @cnt + 1
end
esle
Set @cnt =1
End
end
else
begin
Insert into 表b (BaseWo,Dept1,qty1)
values @No, @Dep, @Qty
set @Base_WO_Main = @No
set @cnt = 0
end

FETCH NEXT FROM Cur1 INTO @No, @Dep, @Qty
end


基本上应该就可以了 我没试

不过这种办法执行效率太低 应该有不用游标的解决方案


2007-02-06 12:15
lengxie
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-10-27
得分:0 
我试试。。。。谢谢了
2007-02-06 12:59
lengxie
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-10-27
得分:0 

CREATE PROCEDURE fill
@base varchar
AS

DECLARE @No int
DECLARE @Dep VARCHAR
DECLARE @Qty int
DECLARE @cnt INT
DECLARE @Base_WO_Main varchar
Declare Cur1 Cursor For
Select * from FILL_REQ_WIP WHERE BASE_WO=@base order by Base_WO
Open Cur1

FETCH NEXT FROM Cur1 INTO @No, @Dep, @Qty

Insert into b (Base_Wo,Dept1,qty1)values(@No, @Dep, @Qty)

Set @cnt = -1
set @Base_WO_Main = @No

WHILE @@FETCH_STATUS = 0
begin
if @Base_WO_Main = @No
begin
if @cnt <> -1
begin
if @cnt = 0
Insert into b (BASE_WO,DEPT1,QTY1) values (@No, @Dep, @Qty)
if @cnt = 1
Insert into b (BASE_WO,DEPT2,QTY2) values (@No, @Dep, @Qty)
if @cnt = 2
Insert into b (BASE_WO,DEPT3,QTY3) values (@No, @Dep, @Qty)
if @cnt = 3
Insert into b (BASE_WO,DEPT4,QTY4) values (@No, @Dep, @Qty)
if @cnt = 4
Insert into b (BASE_WO,DEPT5,QTY5) values (@No, @Dep, @Qty)

set @cnt = @cnt + 1
end
else
Set @cnt =1
End
--end
else
begin
Insert into b (BASE_WO,DEPT1,QTY1)
values (@No, @Dep, @Qty)
set @Base_WO_Main = @No
set @cnt = 0
end

FETCH NEXT FROM Cur1 INTO @No, @Dep, @Qty
close Cur1

end
GO

EXEC fill '000046'
服务器: 消息 16915,级别 16,状态 1,过程 fill,行 11
A cursor with the name 'Cur1' already exists.
服务器: 消息 16905,级别 16,状态 1,过程 fill,行 12
The cursor is already open.

(所影响的行数为 1 行)

Select * from FILL_REQ_WIP WHERE BASE_WO='000046' order by Base_WO 是有记录的可是现在B表都是NULL
版主没有记录的啊

[此贴子已经被作者于2007-2-6 14:02:16编辑过]

2007-02-06 13:55
棉花糖ONE
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:32
帖 子:2987
专家分:0
注 册:2006-7-13
得分:0 


因为相同的BASE_WO最多只有5种dept,所以对base_wo进行分组排序,生成编号,利用编号进行行列转换
select * into a1 from ( select BASE_WO,DEPT_NAME,QTY_BACKLOG,paiming=(select count(1)+1 from a where s.BASE_WO=BASE_WO and s.QTY_BACKLOG<QTY_BACKLOG ) from a s) s1

select BASE_WO,max(case paiming when 1 then name else ' ' end) as dept1,
max(case paiming when 2 then name else ' ' end) as dept2,
max(case paiming when 3 then name else ' ' end) as dept3,
max(case paiming when 4 then name else ' ' end) as dept4,
max(case paiming when 5 then name else ' ' end) as dept5,
sum(case paiming when 1 then score else 0 end) as qty1,
sum(case paiming when 2 then score else 0 end) as qty2,
sum(case paiming when 3 then score else 0 end) as qty3,
sum(case paiming when 4 then score else 0 end) as qty4,
sum(case paiming when 5 then score else 0 end) as qty5
from a1 group by BASE_WO


26403021 sql群 博客 blog./user15/81152/index.shtml
2007-02-06 16:25



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-119859-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.523121 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved