比如生产工序上的应用。
我查出的数据是:
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)总是以刷卡时间升序排列后,能以下一行减上一行,刷卡数量不同的要列出来,然后工序名称 时间等信息也要产生两列存储。谢谢大家

解决方案 »

  1.   

    虽然做出来,但觉得很牵强:
    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
      

  2.   

    虽然能取结果但感觉好蛋疼……悲剧啊。像楼上同志学习。。CREATE TABLE TB(A VARCHAR(10),B VARCHAR(10),C VARCHAR(10),D VARCHAR(10),E INT)
    ---------
    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 行受影响)
    */
      

  3.   


    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语句的结果?谢谢