可以, 如果你用sql 2005的话, 可以写一个聚合的CLR函数

解决方案 »

  1.   

    我用的2000,函数不算复杂,不用CLR可以吗
      

  2.   

    create table Test 
    (F1 char(10), 
     F2 char(2))
    insert into Test  
    select '001' F1,'01' F2 
    union 
    select '001' F1,'02' F2 
    union 
    select '001' F1,'03' F2 用试图表示为
    volumn box
    1      1-3
      

  3.   

    就是上面说的意思啊,比如我有一箱货分两批发,有一个发货表记录发货情况create table Consign 
    (Order_No char(8), 
     Volumn_Code char(8),
     Box_Code char(2))
    insert into Consign  
    select '00000001' Order_No,'00000001' Volumn_Code,'01' Box_Code 
    union 
    select '00000001' Order_No,'00000001' Volumn_Code,'02' Box_Code
    union 
    select '00000001' Order_No,'00000001' Volumn_Code,'03' Box_Code 用视图表示为
    Order_No Volumn_Code Box_Code
    00000001 00000001      1-3
    这里可能要用自定义函数实现
      

  4.   

    create table Consign 
    (Order_No char(8), 
     Volumn_Code char(8),
     Box_Code char(2))
    insert into Consign  
    select '00000001' Order_No,'00000001' Volumn_Code,'01' Box_Code 
    union 
    select '00000001' Order_No,'00000001' Volumn_Code,'02' Box_Code
    union 
    select '00000001' Order_No,'00000001' Volumn_Code,'03' Box_Code 
    UNION
    select '00000001' Order_No,'00000001' Volumn_Code,'07' Box_Code 
    union 
    select '00000001' Order_No,'00000001' Volumn_Code,'08' Box_Code
    union 
    select '00000001' Order_No,'00000001' Volumn_Code,'30' Box_Code 
    GO
    --生成已用编号分布字符串的函数
    CREATE FUNCTION f_Box_Code(
    @Order_No char(8), 
    @Volumn_Code char(8)
    )RETURNS varchar(8000)
    AS
    BEGIN
    DECLARE @re varchar(8000),@pid int
    SELECT @re='',@pid=-1
    SELECT @re=CASE 
    WHEN col2=@pid+1 THEN @re
    ELSE @re
    +CASE 
    WHEN RIGHT(@re,CHARINDEX(',',REVERSE(@re)+',')-1)=@pid THEN ''
    ELSE CAST(-@pid as varchar)
    END
    +','+CAST(col2 as varchar) 
    END,
    @pid=col2
    FROM(
    SELECT col2 = CAST(Box_Code as int)
    FROM Consign
    WHERE Order_No = @Order_No
    AND Volumn_Code = @Volumn_Code
    AND ISNUMERIC(Box_Code) = 1
    ) tb
    ORDER BY col2
    RETURN(STUFF(@re,1,2,'')
    +CASE 
    WHEN RIGHT(@re,CHARINDEX(',',REVERSE(@re)+',')-1)=@pid THEN ''
    ELSE CAST(-@pid as varchar)
    END)
    END
    GO
    -- 视图
    CREATE VIEW v_Consign
    AS
    SELECT 
    Order_No, Volumn_Code,
    Box_Code = dbo.f_Box_Code(Order_No, Volumn_Code)
    FROM(
    SELECT DISTINCT
    Order_No, Volumn_Code
    FROM Consign
    )A
    GO-- 显示视图
    SELECT * FROM v_Consign
    GO-- 删除测试
    DROP TABLE Consign
    DROP VIEW v_Consign
    DROP FUNCTION dbo.f_Box_Code
      

  5.   

    测试结果Order_No Volumn_Code Box_Code
    -------- ----------- ----------------
    00000001 00000001    1-3,7-8,30(1 行受影响)
      

  6.   

    create table test
    (
       idno  int
    )
    declare @i int
    set @i=0
    while(@i<100)
    begin
    insert test select @i
    insert test select @i
    set @i=@i+1end
    create function mysum (@idno int)
    returns int
    as
    begin
    declare @sum bigint
    set @sum=0
    select @sum=@sum+idno from test where idno=@idno
    return @sum
    endselect idno,dbo.mysum(idno) from test group by idno--这样的聚合函数带有很大的局限性
      

  7.   

    我得到的结果是Order_No Volumn_Code Box_Code
    -------- ----------- ----------------
    00000001 00000001    30(1 行受影响)
      

  8.   

    --取個巧,如果樓主要聚合的那列比較"簡單"的話,倒可以試試create table Consign 
    (Order_No char(8), 
     Volumn_Code char(8),
     Box_Code char(2))
    insert into Consign  
    select '00000001' Order_No,'00000001' Volumn_Code,'01' Box_Code 
    union 
    select '00000001' Order_No,'00000001' Volumn_Code,'02' Box_Code
    union 
    select '00000001' Order_No,'00000001' Volumn_Code,'03' Box_Code 
    UNION
    select '00000001' Order_No,'00000001' Volumn_Code,'07' Box_Code 
    union 
    select '00000001' Order_No,'00000001' Volumn_Code,'08' Box_Code
    union 
    select '00000001' Order_No,'00000001' Volumn_Code,'30' Box_Code 
    union 
    select '00000002' Order_No,'00000002' Volumn_Code,'01' Box_Code 
    union 
    select '00000002' Order_No,'00000002' Volumn_Code,'02' Box_Code 
    union 
    select '00000002' Order_No,'00000002' Volumn_Code,'06' Box_Code 
    GOselect id=identity(int,1,1) ,*  into #t from consign order by convert(int,box_code)select order_no,volumn_code,min(box_code)+'-'+max(box_code) as box_code from #t group by order_no,volumn_code,convert(int,box_code)-iddrop table consign
    drop table #t
    /*Result:*/
    /*再串下字串就可以了~~*/
    order_no volumn_code  box_code     
    -------- ----------- --------- 
    00000001 00000001    01-03
    00000001 00000001    07-08
    00000001 00000001    30-30
    00000002 00000002    01-02
    00000002 00000002    06-06
      

  9.   

    ORDER BY col2这句有问题,删除后就正常了。
      

  10.   

    zjcxc(邹建) ,为什么你是3个钻石呢?
      

  11.   

    ORDER BY col2这句有问题,删除后就正常了。-----------------------------
    order by 确实有问题,加了就只处理最大的.而不加也有隐患.你新增一个05试试,此时的05就永远最后一个处理.即结果是"...30,05".邹兄来解释一下啊