第一种情况就是
原始数据如下:
(其中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,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*2*3??
你变成这种形式的依据是什么,愚钝,没看懂意思 ^_^
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的字符
@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
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
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
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条。
就是1,2,3
1,2,4
这样数据的合并成
1>2>3+4第二种情况就是 1,2,3这三个数字的 所有顺序的组合
如果记录中存在,则就合并成一条记录1*2*3
1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1
其实,跟买彩票的复式是一样的。
有什么不明白的,加一下我的hotmail:[email protected]
@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
1*2*3
1*2*……*n
因为这就是需要的最终结果。不用担心这个。因为我的数据多,可能一次有10000条吧,如果用sql做,速度很快一些
起码比较C#里面的循环快一些吧。
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
1.读出记录的A,B,C,D,E字段放入一个名为ReadOfData的数组。
2.将读出来的数组ReadOfData中的数字放入一个名为OutOfData的数组。
3.重复1和2的步骤,直到所有需要的记录都读取完成。
4.对数组OutOfData中的数字进行排序。
5.对OutOfData中的数字用字符串(如*)连接起来生成一个名为OutOfString字符串。
6.输出OutOfString。