根據排序定義表排序資料

2021-04-12 15:20:35 字數 1877 閱讀 8914

測試資料:

create table tb1(id int,col1 varchar(10),col2 int)

insert tb1 select 1,'aa',111

union  all select 2,'aa',111

union  all select 3,'aa',111

union  all select 4,'bb',222

union  all select 5,'bb',222

union  all select 6,'cc',333

union  all select 7,'cc',333

union  all select 8,'cc',333

union  all select 9,'cc',333

create table tb2(col1 varchar(10),size int)

insert tb2 select 'aa',2

union  all select 'cc',2

union  all select 'bb',0

go 問題描述:

tb1 與 tb2 通過 col2 關聯,tb2的col1包含所有tb1.col1。要求寫函式實現:

tb1中的col1按照tb2中的col1定義的記錄數,進行排列。

例如:在tb2中:

aa 的size=2,就先排2條aa記錄

cc 的size=2, 並且在aa後面,所以接著排2條cc的記錄

而bb 在tb2中定義是0條,則不參與排序,始終顯示在最後

重複迴圈,不夠的由後面的記錄補上最終實現如下排序結果:

id          col1       col2       

----------- ---------- -----------

1           aa         111

2           aa         111

6           cc         333

7           cc         333

3           aa         111

8           cc         333

9           cc         333

4           bb         222

5           bb         222

--*/

--排序函式

create function f_sort(@id int,@col1 varchar(10))

returns varchar(20)

asbegin

declare @i int,@size int,@j int

set @i=0

select @i=case when @size is null then @i+1 else @i end

,@size=case when @col1=col1 then size else @size end

from tb2

if @size=0 return(replicate(20,'9'))

select @j=count(*)

from tb1

where id<@id

and return(right(10000000000+isnull(@j,0)/@size,10)+right(10000000000+@i,10))

endgo

--呼叫實現查詢

select * from tb1 a

order by dbo.f_sort(id,col1)

go--刪除測試

drop table tb1,tb2

drop function f_sort

根據排序定義表排序資料

根據排序定義表排序資料 測試資料 create table tb1 id int,col1 varchar 10 col2 int insert tb1 select 1,aa 111 union all select 2,aa 111 union all select 3,aa 111 union...

根據排序定義表排序資料

根據排序定義表排序資料 測試資料 create table tb1 id int,col1 varchar 10 col2 int insert tb1 select 1,aa 111 union all select 2,aa 111 union all select 3,aa 111 union...

根據排序定義表排序資料

根據排序定義表排序資料 測試資料 create table tb1 id int,col1 varchar 10 col2 int insert tb1 select 1,aa 111 union all select 2,aa 111 union all select 3,aa 111 union...