有一个表  t1,字段如下:
      t   d   v1   v2    
      a   1   1    1    
      a   2   2    2    
      b   1   1    1求一sql语句,得出以下结果
      t   d     v1   v2
      a   1\2   3    3
      b   1     1    1 就是按照t来分组,v1和v2求和,d用\来连接

解决方案 »

  1.   

    一條語句是不可能得到結果的,除非在數據庫內建立一個函數,如下:--數據庫中建立一個函數
    CREATE FUNCTION dbo.GetDStr(@t VARCHAR(10))
    RETURNS VARCHAR(100)
    AS
    BEGIN
    DECLARE @tmp VARCHAR(100)
    SET @tmp=''
    SELECT @tmp=@tmp+CAST(d AS NVARCHAR(4)) FROM t WHERE t1=@t
    IF @tmp<>''  SET @tmp=LEFT(@tmp,LEN(@tmp)-1)
    RETURN @tmp
    END
    GO
    --如果數據庫中有建立上面的函數,則查詢衹需一條語句
    SELECT t, dbo.GetDStr(t), SUM(V1) AS v1 ,SUM(v2) AS v2 FROM t1 GROUP BY t
      

  2.   

    更正一下,上面的函數中,沒有加"\",呵--數據庫中建立一個函數
    CREATE FUNCTION dbo.GetDStr(@t VARCHAR(10))
    RETURNS VARCHAR(100)
    AS
    BEGIN
    DECLARE @tmp VARCHAR(100)
    SET @tmp=''
    SELECT @tmp=@tmp+CAST(d AS NVARCHAR(4))+'\' FROM t WHERE t1=@t
    IF @tmp<>''  SET @tmp=LEFT(@tmp,LEN(@tmp)-1)
    RETURN @tmp
    END
    GO--如果數據庫中有建立上面的函數,則查詢衹需一條語句
    SELECT t, dbo.GetDStr(t), SUM(V1) AS v1 ,SUM(v2) AS v2 FROM t1 GROUP BY t
      

  3.   

    boblaw 
    你测试了吗?我测试了怎么dbo.GetDStr(t)返回的是空值呢?
      

  4.   

    沒測試,再試下這個,應該OKCREATE FUNCTION dbo.GetDStr(@t VARCHAR(10))
    RETURNS VARCHAR(100)
    AS
    BEGIN
        DECLARE @tmp VARCHAR(100)
        SET @tmp=''
        SELECT @tmp=@tmp+CAST(d AS NVARCHAR(4))+'\' FROM t1 WHERE t=@t
        IF @tmp<>''  SET @tmp=LEFT(@tmp,LEN(@tmp)-1)
        RETURN @tmp
    END
    GO--如果數據庫中有建立上面的函數,則查詢衹需一條語句
    SELECT t, dbo.GetDStr(t), SUM(V1) AS v1 ,SUM(v2) AS v2 FROM t1 GROUP BY t
      

  5.   

    ok吗?怎么我测试的不ok 啊?
      

  6.   

    我测试得到的结果只是t    d     v1    v2
    a          3     3
    b          1     1
      

  7.   

    if object_id('t1') is not null drop table t1
    go
    select 'a' as t, '1' as d, 1 as v1, 1 as v2
    into t1
    union select 'a', '2', 2, 2
    union select 'b', '1', 1, 1
    go
    -------------------------------------------------------------------
    if object_id('testfunc') is not null drop function testfunc
    go
    create function testfunc  (@t varchar(10)) returns varchar(200)
    as
    begin
      declare @s varchar(200)
      select @s = isnull(@s + '\', '') + d from t1 where t = @t
      return @s
    end
    go
    select t, dbo.testfunc(t) as d, sum(v1) as v1, sum(v2) as v2
    from t1
    group by t
    order by t
    /*
    t     d     v1    v2
    ----  ----  ----  ----
    a     1\2   3     3 
    b     1     1     1   
    */
    go
    -------------------------------------------------------------------
    drop table t1