注册 登录
编程论坛 SQL Server论坛

[求助]请帮我看看

lengxie 发布于 2007-02-06 11:36, 879 次点击

有一个表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编辑过]

11 回复
#2
Kendy1234562007-02-06 11:39

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

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

#3
lengxie2007-02-06 11:43
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
现在可以不?
#4
Kendy1234562007-02-06 11:44
看看论坛关于行列转换的贴 很多的了
#5
lengxie2007-02-06 11:51
以下是引用Kendy123456在2007-2-6 11:44:26的发言:
看看论坛关于行列转换的贴 很多的了

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

#6
lengxie2007-02-06 11:58
不知道说清楚没有???其实就是一个工厂的生产流程,一个工单在哪个部门生产的部门名称和数量。现在要把A表的记录放进B表,DEPT---QTY是对应的,如果现在一个工单只有一个部门在生产那就如上结果的第一条记录
#7
Kendy1234562007-02-06 12:15

要实现是不难的,
把表按照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


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

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

#8
lengxie2007-02-06 12:59
我试试。。。。谢谢了
#9
lengxie2007-02-06 13:55

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编辑过]

#10
棉花糖ONE2007-02-06 16:25


因为相同的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

#11
bygg2007-02-06 18:13
棉花糖ONE 在前面不是发过这样的东东吗?
#12
棉花糖ONE2007-02-06 18:14
恩,以前有个和这个类似的,是时间什么的
1