比如生产工序上的应用。
我查出的数据是:
A(任务单号) B(生产车间) C(刷卡工序) D(刷卡时间) E(刷卡数量)a1 一车间 压铸 15:00 95
a1 二车间 机加 15:10 98
a1 二车间 机加 15:20 100
a1 三车间 电镀 15:30 110
a1 三车间 电镀 15:35 110
以上数据想取得:A(任务单号)B(前车间)B1(后车间) C(前刷卡工序)D(后刷卡工序)E(前刷卡时间)E1(后刷卡时间)F(差异数)
a1 一车间 二车间 压铸 机加 15:00 15:10 3(98-95)
a1 二车间 二车间 机加 机加 15:10 15:20 2 (100-98)
a1 二车间 三车间 机加 电镀 15:20 15:30 10(110-100)总是以刷卡时间升序排列后,能以下一行减上一行,刷卡数量不同的要列出来,然后工序名称 时间等信息也要产生两列存储。谢谢大家
我查出的数据是:
A(任务单号) B(生产车间) C(刷卡工序) D(刷卡时间) E(刷卡数量)a1 一车间 压铸 15:00 95
a1 二车间 机加 15:10 98
a1 二车间 机加 15:20 100
a1 三车间 电镀 15:30 110
a1 三车间 电镀 15:35 110
以上数据想取得:A(任务单号)B(前车间)B1(后车间) C(前刷卡工序)D(后刷卡工序)E(前刷卡时间)E1(后刷卡时间)F(差异数)
a1 一车间 二车间 压铸 机加 15:00 15:10 3(98-95)
a1 二车间 二车间 机加 机加 15:10 15:20 2 (100-98)
a1 二车间 三车间 机加 电镀 15:20 15:30 10(110-100)总是以刷卡时间升序排列后,能以下一行减上一行,刷卡数量不同的要列出来,然后工序名称 时间等信息也要产生两列存储。谢谢大家
create table tb(A varchar(10),B nvarchar(10),C nvarchar(10),D varchar(10),E int)
insert into tb select 'a1','一车间','压铸','15:00',95
insert into tb select 'a1','二车间','机加','15:10',98
insert into tb select 'a1','二车间','机加','15:20',100
insert into tb select 'a1','三车间','电镀','15:30',110
insert into tb select 'a1','三车间','电镀','15:35',110
go
;with c1 as(
select *,row_number()over(order by D)rn from tb a where not exists(select 1 from tb where b=a.b and c=a.c and e=a.e and d<a.d) --去掉B,C,E都相同的行
)
select a.A,a.B,b.B B1,a.C,b.C D,a.D E,b.D E1,b.E-a.E F
from c1 a inner join c1 b on a.rn=b.rn-1
/*
A B B1 C D E E1 F
---------- ---------- ---------- ---------- ---------- ---------- ---------- -----------
a1 一车间 二车间 压铸 机加 15:00 15:10 3
a1 二车间 二车间 机加 机加 15:10 15:20 2
a1 二车间 三车间 机加 电镀 15:20 15:30 10(3 行受影响)
*/
go
drop table tb
---------
INSERT INTO TB(A,B,C,D,E)
SELECT 'a1','一车间','压铸','15:00',95
UNION ALL
SELECT 'a1','二车间','机加','15:10',98
UNION ALL
SELECT 'a1','二车间','机加','15:20',100
UNION ALL
SELECT 'a1','三车间','电镀','15:30',110SELECT * FROM TB-----非游标,不太好用啊..蛋疼
DECLARE @I INT
SET @I=1
WHILE EXISTS(SELECT 1
FROM
(SELECT *,ROW_NUMBER()OVER(ORDER BY A) NB
FROM TB
)T1
WHERE @I+1=NB
)
BEGIN
SELECT A.A,A.B,B.B,A.C,B.C,A.D,A.E,B.E,(B.E-A.E) AS RESULT
FROM
(SELECT *
FROM
(SELECT *,ROW_NUMBER()OVER(ORDER BY A) NB
FROM TB
)TB
WHERE TB.NB=@I
)A,
(SELECT *
FROM
(SELECT *,ROW_NUMBER()OVER(ORDER BY A) NB
FROM TB
)TB
WHERE TB.NB=@I+1
)B
SET @I=@I+1
END
/*结果:
A B B C C D E E RESULT
---------- ---------- ---------- ---------- ---------- ---------- ----------- ----------- -----------
a1 一车间 二车间 压铸 机加 15:00 95 98 3(1 行受影响)A B B C C D E E RESULT
---------- ---------- ---------- ---------- ---------- ---------- ----------- ----------- -----------
a1 二车间 二车间 机加 机加 15:10 98 100 2(1 行受影响)A B B C C D E E RESULT
---------- ---------- ---------- ---------- ---------- ---------- ----------- ----------- -----------
a1 二车间 三车间 机加 电镀 15:20 100 110 10(1 行受影响)
*/
select a.FBillNo,a.PlantName,b.PlantName B1,a.ProcName,b.ProcName D,a.ImportDatetime E,b.ImportDatetime E1,
b.FQty-a.FQty F
from #c1 a inner join #c1 b on a.rn=b.rn-1
rn是row_number() 产生的记录号。上面的语句如果FBillNo 只有一个能达到我的要求。
如果FBillNo在表里有多个,如何像分组一样,不同FBillNo产生上面SQL语句的结果?谢谢