以下是预约表
-----------------------------------------------------------
预约人       同乘人数  班次         预约时间                   备注  
刘洪       1 1 2007-04-09 00:00:00 NULL
刘二       1 2 2007-04-09 00:00:00 NULL
张三       0 3 2007-04-09 00:00:00 NULL
李四       0 4 2007-04-09 00:00:00 NULL
王五       1 3 2007-04-09 00:00:00 NULL
周六       1 1 2007-04-09 00:00:00 NULL
admin      1 2 2007-04-09 00:00:00 NULL
-------------------------------------------------------------
希望得到以下这个表
---------------------------------------------------------------------
预约人          同乘人数       总人数  班次         预约时间         备注  
刘洪 周六    刘洪(1) 周六(1)     4      1           2007-04-09       NULL
刘二 admin   刘二(1) admin(1)    2     2           2007-04-09       NULL
张三 王五    张三(0) 王五(1)     3      3           2007-04-09        NULL
李四         李四(0)             1      4           2007-04-09        NULL
-----------------------------------------------------------------------
条件:按照班次分组,将预约相同班次的预约人合并到一个字段并用空格分开,同时将每个预约人
所带同乘者人数附后并用括号括起来,总人数=预约人+同乘人数。预约时间只取最近的日期相同的
日期部分,不取时间。不知道我说明白了没有,在线等!

解决方案 »

  1.   

    如果不要合并就比较简单了
    group by 班次 order by 班次关注一下
      

  2.   

    学习~~
    不过想问下
    刘二 admin   刘二(1) admin(1)    2     2           2007-04-09       NULL那个总人数是2???
    是不是该是4啊???按你说的
    总人数=预约人+同乘人数
      

  3.   

    这种合并还是用程序写吧,SQL语句很难实现的,比较麻烦
      

  4.   

    字符串合并没有办法,加上函数应该可以,我写了一个测试的例子:
    --建表
    create table mytest
    (
    mname varchar(50),
    num int,
    part int
    )insert into mytest(mname,num,part) values('刘洪',1,1);
    insert into mytest(mname,num,part) values('刘二',1,2);
    insert into mytest(mname,num,part) values('张三',0,3);
    insert into mytest(mname,num,part) values('李四',0,4);
    insert into mytest(mname,num,part) values('王五',1,3);
    insert into mytest(mname,num,part) values('周六',1,1);
    insert into mytest(mname,num,part) values('admin',1,2);--建立两个合并字符串的函数
    IF EXISTS (SELECT * 
       FROM   sysobjects 
       WHERE  name = 'FN_GetNames_For_Test')
    DROP FUNCTION FN_GetNames_For_Test
    GO
    CREATE FUNCTION dbo.FN_GetNames_For_Test(@p_part int)
    RETURNS VARCHAR(100) AS
    BEGIN
    DECLARE @ReturnValue VARCHAR(100)
    DECLARE @mname VARCHAR(30)

    DECLARE names_cursor CURSOR FOR
    SELECT mname FROM mytest WHERE part=@p_part SET @ReturnValue = '' OPEN names_cursor FETCH NEXT FROM names_cursor INTO @mname
    WHILE @@FETCH_STATUS = 0
    BEGIN
    SET @ReturnValue = @ReturnValue + @mname + ' '
        FETCH NEXT FROM names_cursor INTO @mname
    END

    CLOSE names_cursor RETURN @ReturnValue
    END
    GOIF EXISTS (SELECT * 
       FROM   sysobjects 
       WHERE  name = 'FN_GetNames_For_Test2')
    DROP FUNCTION FN_GetNames_For_Test2
    GO
    CREATE FUNCTION dbo.FN_GetNames_For_Test2(@p_part int)
    RETURNS VARCHAR(100) AS
    BEGIN
    DECLARE @ReturnValue VARCHAR(100)
    DECLARE @mname VARCHAR(30)
    DECLARE @num  int

    DECLARE names_cursor CURSOR FOR
    SELECT mname,num FROM mytest WHERE part=@p_part SET @ReturnValue = '' OPEN names_cursor FETCH NEXT FROM names_cursor INTO @mname,@num
    WHILE @@FETCH_STATUS = 0
    BEGIN
    SET @ReturnValue = @ReturnValue + @mname + '(' + convert(varchar,@num) + ')' + ' '
        FETCH NEXT FROM names_cursor INTO @mname,@num
    END

    CLOSE names_cursor RETURN @ReturnValue
    END
    GO--应用
    select 
    dbo.FN_GetNames_For_Test(part),
    dbo.FN_GetNames_For_Test2(part),
    part,
    sum(1+isnull(num,0)) 
    from mytest
    group by 
    dbo.FN_GetNames_For_Test(part),
    dbo.FN_GetNames_For_Test2(part),
    partorder by part--结果
    刘洪 周六  刘洪(1) 周六(1)  1 4
    刘二 admin  刘二(1) admin(1)  2 4
    张三 王五  张三(0) 王五(1)  3 3
    李四           李四(0)           4 1