--Soru:
--Tabloda Ençok Geçen Kelimenin Bulunması
--baslik,giris,haber ve id alanları var diyelim ve tablomuzun adıda TYazilar olsun.
--baslik,giris,haber alanları içerisinde en çok geçen kelimeyi bulan sql sorgusu nu ben bulamadım yardımedecek arkadaşlar varsa paylaşımları bekliyorum.
--
--CEVAP:
--kelimeyi kendi kolonların içerisinde oluşturman için öncelikle... bir split fonskiyonu oluşturuyoruz... split fonksiyonunu daha sonra sorgumuz içerisinden dönecek satırları ayırmak için kullanıcaz ve bunu oluşturduğumuz sanal tablomuza ekleyecez... burada iki döngümüz olacak öncelikle tablomuzun satırları arasında dönecez ve dönerken her bir satırın içindeki kelimeler arasında dönecezez... ve bunlardan dönecek olan kelime ve sayıları oluşturduğumuz sanal tabloya ekleyeceğiz....
--İlk olarak fonkisyonumuzu oluşturalım...
CREATE FUNCTION [dbo].[Split](@String nvarchar(4000), @Delimiter char(1))
returns @Results TABLE (Sno int,Items nvarchar(4000))
as
begin
declare @index int
declare @slice nvarchar(4000)
declare @sno int
select @index = 1
if @String is null return
set @sno = 0
while @index != 0
begin
select @index = charindex(@Delimiter,@String)
if @index !=0
select @slice = left(@String,@index - 1)
else
select @slice = @String
set @sno = @sno + 1
insert into @Results(sno,Items) values(@sno,@slice)
select @String = right(@String,len(@String) - @index)
if len(@String) = 0
break
end
return
end
GO
-- Daha Sonra aşağıdaki işlemleri kendi database yapımıza göre değiştirelim...
-- Kolon ve tablo isimlerimizi değiştirelim... ve Test edelim...
-- İşlemler esnasında kullanacağımız değişkenlerimiz...
DECLARE @AranacakKelime nvarchar(50)
DECLARE @ToplamKayitSayi int
DECLARE @ArtanKayitSayi int
DECLARE @KelimeSayi int
DECLARE @SplitKelime nvarchar(50)
DECLARE @SplitKelimeSayi int
DECLARE @SplitToplamKelimeSayi int
DECLARE @SplitKelimeArtanSayi int
-- Kelimeleri içerisinde biriktireceğimiz sanal tablomuz...
DECLARE @Tablo table (Kelime nvarchar(50),Sayi int)
-- Değişkenlerimize ilk değerlerini atıyoruz...
Set @ToplamKayitSayi=1
Set @ArtanKayitSayi=1
Set @SplitKelimeSayi=1
Set @SplitKelimeArtanSayi=1
-- Tablomuzdaki toplam kayıt sayısını alıyoruz...
SELECT @ToplamKayitSayi=COUNT(HaberBaslik)
FROM MWS_Haber
-- Toplam kayıt sayısı kadar tablomuz içerisinde dönüyoruz...
While @ToplamKayitSayi>=@ArtanKayitSayi
begin
-- RowNumber() ile tablomuz içerisinde satır satır dönüyoruz
SELECT TOP(1) @AranacakKelime=HaberBaslik FROM
(
Select ROW_NUMBER() OVER(ORDER BY HaberBaslik DESC) AS SatirNo, -- Satır Numarası
HaberBaslik
FROM MWS_Haber
) HaberListe WHERE SatirNo=@ArtanKayitSayi
-- Satırdan gelen cümle içerisindeki kelimeleri boşluklara göre bölüp içerisindeki sayısını buluyoruz...
SELECT @SplitToplamKelimeSayi=Count(Items)
FROM dbo.Split(@AranacakKelime,' ')
-- Satırdan gelen cümledeki boşluklara göre kelime sayısını bulduktan sonra
-- Kelimeler arasında toplam kelime sayısı kadar dönüyoruz..
While @SplitToplamKelimeSayi>=@SplitKelimeArtanSayi
begin
-- Gelen kelimeyi boşluğuna göre ayırma işlemini yapıyoruz...
-- Kelime sayı indexine göre kelimeler arasında dönüyoruz...
SELECT TOP(1) @SplitKelime=Items
FROM dbo.Split(@AranacakKelime,' ')
Where Sno=@SplitKelimeArtanSayi
-- içerisinde kelimemiz geçen tüm satırların sayısını buluyoruz..
SELECT @SplitKelimeSayi=COUNT(HaberBaslik)
FROM dbo.MWS_Haber
WHERE (HaberBaslik LIKE N'%'+@SplitKelime+'%')
-- Oluşturduğumuz sanal Tablomuza elde ettiğimiz değerleri ekliyoruz...
insert into @Tablo(Kelime,Sayi) Values(@SplitKelime,@SplitKelimeSayi)
-- Kelime sayı indeximizi bir artırıyoruz...
SET @SplitKelimeArtanSayi=@SplitKelimeArtanSayi+1
end
-- Satır sayı indeximizi bir artırıyoruz..
SET @ArtanKayitSayi=@ArtanKayitSayi+1
end
-- Oluşan sanal tablomuza sorgumuzu çekiyoruz...
SELECT * From @Tablo
--Sonuç:
--Kelime - Sayi
--Yaşıyoruz - 2
--Öylesine - 1
--... - 6
--Ölesiye - 1
--bu - 4
--şiirde - 1
--seninle - 1
--gizlendi. - 1