1

重複の可能性:
SQL Server の複雑なデータ ソートのヘルプが必要

これは、並べ替えて表示する必要があるSQLサーバーの私のデータです

Table : MyTable
------------------
ID  Title
-----------
1   Geo Prism GEO 1995 GEO* - ABS #16213899
2   Excavator JCB - ECU P/N: 728/35700
3   Geo Prism GEO 1995 - ABS #16213899
4   JCB Excavator JCB- ECU P/N: 728/35700
5   Geo Prism GEO,GEO 1995 - ABS #16213899 GEO
6   Maruti gear box #ABS 4587

GEO や JCB などの検索語に基づいてデータを並べ替えたい

GEO または JCB がここで最大時間を見つけた場合、これらの行が最初に来ます。GEO は 3 行で見つかり、JCB は 2 行で見つかりました。そのため、すべての行には GEO キーワードがあり、それらが一番​​上に来て、次の JCB 関連の行が来ます。ついにアンマッチ列がやってきます。

再びソートが行われます。GEO 関連の行では、最大の GEO キーワードを持つ行が最初に表示されます。同じ JCB 関連の行がソートされます。

ここで、私が必要とするアウトの種類を示す画像を提供しています

ここに画像の説明を入力 私はこの質問をしましたが、私の要件を完全に満たしていない回答を得ました。だから、これが私がこの質問のために得たSQLです。

CREATE FUNCTION [dbo].[Split] (@String varchar(8000), @Delimiter char(1))     
returns @temptable TABLE (items varchar(8000))       
as       
begin       
declare @idx int       
declare @slice varchar(8000)       

select @idx = 1       
    if len(@String)<1 or @String is null  return       

while @idx!= 0       
begin       
   set @idx = charindex(@Delimiter,@String)       
   if @idx!=0       
       set @slice = left(@String,@idx - 1)       
   else       
      set @slice = @String       

   if(len(@slice)>0)  
       insert into @temptable(Items) values(@slice)       

   set @String = right(@String,len(@String) - @idx)       
   if len(@String) = 0 break       
end   
return       
end

DECLARE @Sterm varchar(MAX) 
SET @Sterm ='GEO JCB'
;WITH SearchResult (rnum, title)
as 
(   
(select 1 as rnum,'Geo Prism GEO 1995 GEO* - ABS #16213899' as title)
union all
(select 2 as rnum,'Excavator JCB - ECU P/N: 728/35700' as title)
union all
(select 3 as rnum,'Geo Prism GEO 1995 - ABS #16213899' as title)
union all
(select 4 as rnum,'JCB Excavator JCB- ECU P/N: 728/35700' as title)
union all
(select 5 as rnum,'Geo Prism GEO,GEO 1995 - ABS #16213899 GEO' as title)
union all
(select 6 as rnum,'dog' as title)
) 

select rnum, title from SearchResult
join 
( select lower(Items) as term 
  from dbo.Split(@Sterm , ' ')
) as search_terms
on lower(SearchResult.title) like '%' + search_terms.term +'%'
order by 
search_terms.term,
(select count(*)
from dbo.Split(lower(SearchResult.title),' ')
where Items = search_terms.term
) desc 
4

1 に答える 1

0
declare @SearchItem varchar(1000)='GEO,JCB'

@Instring varchar(2000)='' を宣言し、タイトルが ''%'+items+'%'' の場合は @Instring=@Instring+' を選択し、dbo.split(@SearchItem,', ') exec(' declare @tbl table(id int,title varchar(200)) ; with CTE as ( select 1 as id, ''Geo Prism GEO 1995 GEO* - ABS #16213899'' as Title union select 2 as id 、「Excavator JCB - ECU P/N: 728/35700」をタイトル ユニオンとして ID として 3 を選択、「Geo Prism GEO 1995 - ABS #16213899」をタイトル ユニオンとして ID として 4 を選択、「JCB Excavator JCB- ECU P/N: 728/35700'' タイトル ユニオンとして ID として 5 を選択、'' Geo Prism GEO,GEO 1995 - ABS #16213899 GEO'' タイトル ユニオンとして ID として 6 を選択、''Maruti ギア ボックス #ABS 4587' ' 題して)

@tbl に挿入、CTE から ID、タイトルを選択

@tbl2 テーブルを宣言します(id int,T int,title varchar(200),Tl varchar(200),CC int) @tbl2 に挿入します (id,T,title,Tl) select id,T,title,Tl from(select tb.id,sub.T,tb.title ,Tl from (select case '+@Instring +' else ''Other'' END as Tl ,count(*)T from @tbl group by case '+@Instring +' else ''Other'' END)Sub
Join @tbl tb on tb.Title like ''%''+sub.Tl +''%'' )Sub1


@Ttle varchar(max) を宣言 @Tl varchar(max) を宣言@id int を宣言 @i int=0 を宣言 @Nbr int=0 を宣言@Ttle,@id,@Tl while @@FETCH_STATUS =0 while (@i<=len(@Ttle)) begin if charindex(@Tl,@Ttle)!=0 set @Nbr =@Nbr +1 set @ Ttle =stuff(@Ttle,charindex(@Tl,@Ttle),len(@Tl),'''') set @i=@i+1 end

     update @tbl2 set cc=@Nbr where id=@id 
     set @Nbr =0 

次を Cursr から @Ttle,@id,@Tl にフェッチします end

select id,T,title,Tl,CC from
(select id,T,title,Tl,CC from @tbl2
union select id,0 as T,title,'''' as Tl,0 as CC from @tbl where idにありません (@tbl2 から ID を選択))T desc,CC desc ' による S1 オーダー

于 2012-08-06T16:55:53.933 に答える