--存储过程A(票据名称、操作时间)
if exists(select * from sysobjects where name='pro_BNamePrintInfo')
drop proc pro_BNamePrintInfo
go
create proc pro_BNamePrintInfo
 @B_Name varchar(16),--发票据名称
 @B_start varchar(16), --起始时间
 @B_End   varchar(16) --终止时间
as
begin
select distinct b.BCode as 发票代码, b.BName as 发票名称,
期初库存      =z.期初库存,
发票号码      =z.发票号码,
本期开具      =本期开具,
发票号码      =k.发票号码
from BillDate b 
 join (select BCode,count(*) as 期初库存, rtrim(MIN(bnum))+'-'+rtrim(Max(bnum))  as 发票号码       from BillDate where  BOldState='期初库存'group by all bcode) z on z.BCode=b.BCode
 join (select BCode,rtrim(MIN(bnum))+'-'+rtrim(Max(bnum)) as 发票号码,count(*)   as 本期开具       from BillDate where  BNewState='已开具'  group by all BCode) k on k.BCode=b.BCode
where b.BName=@B_Name and b.BDate between @B_start and @B_End 
end
go当我执行这个存储过程的时候(数据没有05,所以期初库存只有9条) 
exec pro_BNamePrintInfo '建筑安装','2009-01-01','2009-12-12' 
得到的结果是: 
发票号码  发票名称  期初库存  具体号码  本期开具  具体号码 
0000001  一般发票      9       01-10        9       01-10 我要怎么改成下面的结果
发票号码  发票名称  期初库存  发票号码   本期开具  具体号码   
0000001  一般发票      9       01-04       9        01-04
0000001  一般发票      9       06-10       9        06-10
 

解决方案 »

  1.   

    ----------------------------------------------------------------
    -- Author  :fredrickhu(我是小F,向高手学习)
    -- Date    :2009-12-04 15:08:18
    -- Version:
    --      Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) 
    --    Nov 24 2008 13:01:59 
    --    Copyright (c) 1988-2005 Microsoft Corporation
    --    Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
    --
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([id] int)
    insert [tb]
    select 1 union all
    select 2 union all
    select 3 union all
    select 4 union all
    select 6 union all
    select 7 union all
    select 8 union all
    select 9 union all
    select 10
    --------------开始查询--------------------------
    select case when min(t.id)<>max(t.id) then cast(min(t.id) as varchar)+'-'+cast(max(t.id) as varchar) else cast(min(t.id) as varchar) end
    from
    (
    select id,id-(select count(*) from tb b where a.id>=b.id)  groupid
    from tb a
    ) t
    group by groupid 
    ----------------结果----------------------------
    /*-------------------------------------------------------------
    1-4
    6-10(2 行受影响)
     
    */
      

  2.   

    并且我要把语句放进上面存储过程join的里面
      

  3.   


     
    --> 生成测试数据: @tb
    DECLARE @tb TABLE (代码 varchar(3),号码 int)
    INSERT INTO @tb
    SELECT '001',1 UNION ALL
    SELECT '001',2 UNION ALL
    SELECT '001',3 UNION ALL
    SELECT '001',4 UNION ALL
    SELECT '001',6 UNION ALL
    SELECT '001',7 UNION ALL
    SELECT '001',8 UNION ALL
    SELECT '001',9 UNION ALL
    SELECT '001',10--SQL查询如下:
    SELECT 代码,
        RTRIM(号码) + '~' +
        RTRIM((SELECT MIN(号码)
           FROM @tb AS B
           WHERE 代码=A.代码
               AND 号码>=A.号码
               AND NOT EXISTS(SELECT * FROM @tb
                             WHERE 代码=B.代码
                                 AND 号码=B.号码+1))) AS 详细号码
    FROM @tb AS A
    WHERE NOT EXISTS(SELECT * FROM @tb
                    WHERE 代码=A.代码 AND 号码 = A.号码-1)/*
    代码   详细号码
    ---- -------------------------
    001  1~4
    001  6~10(2 行受影响)
    */
      

  4.   


     
    --> 生成测试数据: @tb
    DECLARE @tb TABLE (代码 varchar(3),号码 int)
    INSERT INTO @tb
    SELECT '001',1 UNION ALL
    SELECT '001',2 UNION ALL
    SELECT '001',3 UNION ALL
    SELECT '001',4 UNION ALL
    SELECT '001',6 UNION ALL
    SELECT '001',7 UNION ALL
    SELECT '001',8 UNION ALL
    SELECT '001',9 UNION ALL
    SELECT '001',10--SQL查询如下:
    SELECT 代码,RTRIM(MIN(号码))+'~'+RTRIM(MAX(号码)) AS 详细号码
    FROM(SELECT rowid=ROW_NUMBER() OVER(PARTITION BY 代码 ORDER BY 号码)-号码,*
         FROM @tb) AS A
    GROUP BY 代码,rowid
    ORDER BY 1,MIN(号码)/*
    代码   详细号码
    ---- -------------------------
    001  1~4
    001  6~10(2 行受影响)
    */
      

  5.   

    ROW_NUMBER 和PARTITION是什么? 能QQ指点我一下吗?我的是:412972507
      

  6.   

    排序的话,能不能嵌套排序,就是外面按照BCode排序,里面再按BDate排序,就是一个BCode里面再安装BDate排序?