现有这样一张单据 
单据编号    作废标识 
001            1 
002            1 
003            0 
004            0 
005            0 
006            1 
007            0 
008            0 
009            1 
010            0 
011            1 
012            0 
013            0 
014            1 
015            0 
016            0 
出这样一张报表 
本期领用 本期作废 
份数 起始号码 截止号码  份数    起始号码    截止号码 
null   null      null    2       001          002 
3      003       005     1       006          006 
2      007       008     1       009          009    
1      010       010     1       011          011    
2      012       013     1       014          014    
2      015       016     
1表示作废  0标识正常单据 
注意只管数据就好,表头上面的本期领用和本期作废不用管
本来前面已经发过这个帖子,而且各位大侠都帮解决了,但是客户要求顺序显示,今天弄了一天硬是没弄出来,望大虾们再帮改改

解决方案 »

  1.   

    如果编号(fno)是数字,而且连续(中间没有缺号)可以差额自联:
    --取未作废的起始编号
    select a.fno,'b' fs
    from tb a
    left join b on a.fno=b.fno+1
    where a.fstat=0 and b.fstat=1
    union all
    --取未作废的结束编号
    select a.fno,'e'
    from tb a
    left join b on a.fno=b.fno-1
    where a.fstat=0 and b.fstat=1
      

  2.   

    你看下那个报表出来的格式就知道了。
    比如
    001 1
    002 0
    003 0
    004 1
    005 0
    显示格式是这个样子的
           本期领用             本期作废
    份数   起用号   止号   份数    起用号   止号
    null   null   null   1       001   001
    2      002      003  1       004   004
    1      005      005  null    null  null     
     
      

  3.   

    这个有什么难度? 但是你要求一条SQL, 也不是难事,问题是写出这样的东西实用不?
      

  4.   

    --先写一个多句的
    DECLARE @TB TABLE([NO] VARCHAR(3), [FLAG] INT)
    INSERT @TB 
    SELECT '001', 1 UNION ALL 
    SELECT '002', 1 UNION ALL 
    SELECT '003', 0 UNION ALL 
    SELECT '004', 0 UNION ALL 
    SELECT '005', 0 UNION ALL 
    SELECT '006', 1 UNION ALL 
    SELECT '007', 0 UNION ALL 
    SELECT '008', 0 UNION ALL 
    SELECT '009', 1 UNION ALL 
    SELECT '010', 0 UNION ALL 
    SELECT '011', 1 UNION ALL 
    SELECT '012', 0 UNION ALL 
    SELECT '013', 0 UNION ALL 
    SELECT '014', 1 UNION ALL 
    SELECT '015', 0 UNION ALL 
    SELECT '016', 0DECLARE @FLAG INT
    SET @FLAG=(SELECT TOP 1 FLAG FROM @TB ORDER BY NO)SELECT *,ID=IDENTITY(INT,1,1) INTO # FROM @TB WHERE FLAG=1  ORDER BY NO
    SELECT *,ID=IDENTITY(INT,1,1) INTO #2 FROM @TB WHERE FLAG=0  ORDER BY NOSELECT *,ID=IDENTITY(INT,1,1) INTO #T
    FROM (SELECT COUNT(*) AS CNT, MIN(NO) AS MINNO,MAX(NO) AS MAXNO FROM # GROUP BY NO-ID) AS T
    ORDER BY MINNOSELECT *,ID=IDENTITY(INT,1,1) INTO #T2
    FROM (SELECT COUNT(*) AS CNT, MIN(NO) AS MINNO,MAX(NO) AS MAXNO FROM #2 GROUP BY NO-ID) AS T
    ORDER BY MINNOSELECT B.CNT,B.MINNO,B.MAXNO,A.CNT,A.MINNO,A.MAXNO
    FROM #T AS A  FULL JOIN #T2  AS B
      ON (@FLAG=1 AND A.ID=B.ID+1) OR (@FLAG=0 AND A.ID+1=B.ID)
    DROP TABLE #
    DROP TABLE #2
    DROP TABLE #T
    DROP TABLE #T2
      

  5.   

     ff相减<>0的则表带出份数我是这样想的,可是我不知道怎么写.还在研究中...