第一种情况就是
 原始数据如下:
  (其中1,2,3是有顺序的)
  字段名 A,B,C 
         1,2,3
         1,2,4
         1,2,5
 要变成这样的数据1>2>3+4+5 第二种就是上面第一种的一种极限情况
 (其中1,2,3是有顺序的)
 字段名 A,B,C 
        1,2,3
        1,3,2 
        2,1,3
        2,3,1
        3,1,2
        3,2,1
 
 要变成这样的数据1*2*3
 
 其中A,B,c是字段
 高手帮忙啊。。
 (做了3个字段的,还要做4,5个字段的)

解决方案 »

  1.   

    1>2>3+4+5??
    1*2*3??
    你变成这种形式的依据是什么,愚钝,没看懂意思  ^_^
      

  2.   

    第一种,就是 
    1,2,3
    1,2,4
    1,2,5
    前两项一样的
    都是1,2的,合并
    就变成了1>2>3+4+5第二种,就是
    1,2,3任意顺序的合并
    就是
       1,2,3
       1,3,2 
       2,1,3
       2,3,1
       3,1,2
       3,2,1
    这是1,2,3 任何顺序的数据合并.
    变成 1*2*3的字符
      

  3.   

    用函数create function fn_str(
    @a int,
    @b int
    )
    returns varchar(200)
    as
    begin
       declare @r varchar(200)
       if (select count(distinct c) from tablename where a=@a and b=@b)>1
       begin
          set @r=cast(@a as varchar)+'>'+cast(@b as varchar)+'>'
          select @r=@r+cast(c as varchar)+'+' from tablename where a=@a and b=@b group by c
          set @r=right(@r,len(@r)-1)
       end
       else
           select @r=cast(@a as varchar)+'*'+cast(@b as varchar)+'*'+cast(c as varchar) from tablename where a=@a and b=@b    return @r
    end
    go--查询
    select dbo.fn_str(a,b) as data from tablename group by a,b
      

  4.   

    第一种可用distinct函数,用一循环就可实现 ,第二种还是看不懂。
      

  5.   

    /*create table tb (A int ,B int ,C int)
    insert tb select        1,2,3
    union all select        1,3,2 
    union all select        2,1,3
    union all select        2,3,1
    union all select        3,1,2
    union all select        3,2,1*//*truncate table tb
    insert tb select        1,2,3
    union all select         1,2,4
    union all select         1,2,5*/
    select a,b,c,identity(int) id into # from tb
    select * into #1 from
    (select a,id from # union all
    select b,id from # union all
    select c,id from #) aif not exists(select 1 from #1 b where b.a not in(select a from #1 where id=1))
    select rtrim(a) + '*' + rtrim(b) + '*' + rtrim(c) from # where id=1
    else
    Select a,b,dbo.f_join(a,b) From tb Group By a,bdrop table #,#1
      

  6.   

    --函数刚才忘发了
    Create Function f_join
    (@a int,@b int)
    Returns Varchar(1000)
    As
    Begin
    Declare @s Varchar(1000)
    Set @s=''
    Select @s=@s + '+' + Rtrim(c) From tb Where A=@a AND b=@b
    Return Stuff(@s,1,1,'')
    End
      

  7.   

    - 创建原始数据
    Create database [TestMerge]
    GOCREATE TABLE [dbo].[BaseData](
    [A] [int] NULL,
    [B] [int] NULL,
    [C] [int] NULL
    ) ON [PRIMARY]go INSERT INTO BaseData([A],[B],[C]) VALUES (1,2,3)
    INSERT INTO BaseData([A],[B],[C]) VALUES (1,3,2)INSERT INTO BaseData([A],[B],[C]) VALUES (2,1,3)
    INSERT INTO BaseData([A],[B],[C]) VALUES (2,3,1)INSERT INTO BaseData([A],[B],[C]) VALUES (3,1,2)
    INSERT INTO BaseData([A],[B],[C]) VALUES (3,2,1)
    ===========================
    use testMerge
    godrop function fn_str
    goCREATE FUNCTION  Fn_str(
      @a INT,
      @b INT
    )
    RETURNS VARCHAR(200)
    AS
    BEGIN
       DECLARE @r VARCHAR(200)
       IF (SELECT count(distinct c) FROM BaseData WHERE a=@a and b=@b)>1
       BEGIN
          SET @r=cast(@a AS VARCHAR)+'>'+cast(@b AS VARCHAR)+'>'
          SELECT  @r=@r+cast(c AS VARCHAR)+'+' FROM BaseData WHERE a=@a and b=@b GROUP BY c
          SET @r=right(@r,len(@r)-1)
       END
       ELSE
           SELECT @r=cast(@a AS VARCHAR)+'*'+cast(@b AS VARCHAR)+'*'+cast(c AS VARCHAR) FROM BaseData 
           WHERE a=@a and b=@b 
       return @r
    end
    go--查询
    SELECT  dbo.fn_str(A,B) AS data FROM  BaseData GROUP BY A,
    得出的结果1*2*3
    1*3*2
    2*1*3
    2*3*1
    3*1*2
    3*2*1这样并不是我要的 1*2*3
    就这一条就代替了前面的6条。
      

  8.   

    有啥不明白的
    就是1,2,3
        1,2,4
    这样数据的合并成
    1>2>3+4第二种情况就是 1,2,3这三个数字的 所有顺序的组合
    如果记录中存在,则就合并成一条记录1*2*3
      

  9.   

    是数据合并啊。
      1,2,3
       1,3,2 
       2,1,3
       2,3,1
       3,1,2
       3,2,1
    其实,跟买彩票的复式是一样的。
    有什么不明白的,加一下我的hotmail:[email protected]
      

  10.   

    create proc proc_t
    @Snum int,
    @Enum int
    as
    set nocount on
    declare @V numeric(10)
    declare @T varchar(100)
    declare @intT int
    declare @a table(A int,B int,C int)
    insert @a select 1,2,3
    union all select 1,3,2
    union all select 2,1,3
    union all select 2,3,1
    union all select 3,1,2
    union all select 3,2,1
    set @V=1 
    set @intT=@Snum
    set @T=''
    while @intT<=@Enum
    begin
    set @V=@V*@intT
    set @intT=@intT+1
    end
           select a.a,a.b,a.c from 
    (select a,b,c from @a) a
    Inner Join 
    (select a=b,b=c,c=a from @a) b On a.a=b.a and a.b=b.b and a.c=b.c
    Inner Join
    (select a=c,b=a,c=b from @a) c On b.a=c.a and b.b=c.b and b.c=c.c

    if @@rowcount=@V
    begin
    set @intT=@Snum
    while @intT<=@Enum
    begin
    set @T=@T+cast(@intT as varchar)+'*'
    set @intT=@intT+1
    end
    print left(@T,len(@T)-1)
    end
    else
    print 'No No No'
    Go
    proc_t 1,3
      

  11.   

    Exec proc_t 1,3 --------------------------
    1*2*3
      

  12.   

    我想lz的第二种情况是:如果每一列的数据包含了所有在列数n在内的数据,就显示为
    1*2*……*n
      

  13.   

    我想问清楚是多条记录组合成一个字符串,然后通过存储过程返回到客户端吗?无论你怎么做,你生成的这个字符串总是有用处的吧。你应该把你的需求说明清楚一些,本来TSQL语言就不是很强大,很难做到跟面向对象的语言(如C#)相比,如果你的项目非得用SQL编程来实现这个东西,我劝你还是快点换别的方法吧,如果计算的东西太复杂了,你以后的维护会非常困难的,当客户提出需求变更时,越复杂的东西越难以修改和维护。你无法想像需求变更带来的是什么东西。即使你这次实现了这个东西,但你能保证在下次需求变更时你能才一次把它搞定吗?它会在每次需求变更的时候变得越来越复杂。导致最后你只好放弃它。因为类似这样的问题我也碰到过,不过我是不会再走以前的冤枉路了。
      

  14.   

    是啊,多条记录,变成一条记录,这次输出的东西,是不会变的。
    因为这就是需要的最终结果。不用担心这个。因为我的数据多,可能一次有10000条吧,如果用sql做,速度很快一些
    起码比较C#里面的循环快一些吧。
      

  15.   

    呵呵,有点糊涂,因为搂主似乎要实现两种功能,还是说要自动判断是什么情况来实现哪一种功能呢。用sql的效率也未必能比在前台实现高多少。而且确实维护麻烦
      

  16.   

    第2种,lz的意思是不是要找出有多少的完全组合啊?就是把符合完全组合的一组数据用简式来替代啊?是的话可以这样考虑啊:
    select a,b,c,sortabc from tablename group by sortabc having count(sortabc) = 6
    其中sortabc 是a,b,c排好序的形式(比如1*2*3)这样不就可以找出lz所说的符合第2种情况的数了吗,接下来进行lz的其他想法应该是比较容易了.
    create function sortabc (
    @a int,
    @b int,
    @c int)
    return varchar(100)
    as
    begin
    if @a>@b>@creturn cast(@a,varchar)+'*'+@b+'*'+@c
    ...
    end
    goend
    go
      

  17.   

    你的意思不是说的只要在表中只有1,2,3的6种排列就打印1*2*3吗?怎么还要结果,如果要顺序就加个order by a.a,a.b.a.c
      

  18.   

    我给出实现的一般形式。
    1.读出记录的A,B,C,D,E字段放入一个名为ReadOfData的数组。
    2.将读出来的数组ReadOfData中的数字放入一个名为OutOfData的数组。
    3.重复1和2的步骤,直到所有需要的记录都读取完成。
    4.对数组OutOfData中的数字进行排序。
    5.对OutOfData中的数字用字符串(如*)连接起来生成一个名为OutOfString字符串。
    6.输出OutOfString。