15.12.16 00:15
Üstteki SELECT ROW_NUMBER() OVER ( ORDER BY [UrunID] ASC ) AS RowNumber, ..... bölümü, kayıtları UrunID değerine göre sıraladıktan sonra, bu sıraya göre her kayda 1, 2, 3 şeklinde değer verir. Ancak sorgunun devamında CASE'ler ile belirlediğin sıralamada kayıtlar yeniden ve belirttiğin alana göre sıralanıyor. Dolayısıyla RowNumber sıralaması bozuluyor. Ancak sen altta sonuç tablosundaki kayıtları isterken RowNumber'a göre istiyorsun. Sıralama artık buna göre olmadığından beklediğin sonucu alamazsın. Bana göre bunun için en kısa çözüm OVER bölümünü şöyle değiştirmendir. SELECT ROW_NUMBER() OVER
(
ORDER BY (SELECT 0)
) AS RowNumber, ....... Bu, UrunID'ye göre satır numarası vermez ve CASE'ler ile yaptığın sıralamaya göre her kayıt bir RowNumber değeri alır. Son olarak bu şekilde geçici tablolarla sayfalama yapmak yerine SQL Server 2012 kullanıyorsan OFFSET ve FETCH NEXT kullanımını öneririm. Daha az kod yazarsın ve daha yeni bir yöntem. Ek: OFFSET ile bir örnek ALTER PROCEDURE [dbo].[GetCustomersPageWise]
@PageIndex INT = 1,
@PageSize INT = 15,
@orderColumn int,
@orderdir nvarchar(10),
@RecordCount INT OUTPUT
AS
BEGIN
SELECT Urunler.UrunFiyati,Urunler.StokKodu, dbo.Urunler.UrunAdi, dbo.Urunler.Nekadardandustu,
dbo.Urunler.Hit,dbo.Urunler.UrunDetay, dbo.Urunler.UrunId, dbo.Urunler.EnCokSatanlar, dbo.Urunler.Indirimdekiler,
dbo.Urunler.Resmi2, dbo.Urunler.Resmi, dbo.Urunler.Onay,
dbo.Urunler.Vitrin, dbo.UrunKategoriler.UrunKategoriAdi
FROM dbo.Urunler INNER JOIN dbo.UrunKategoriler ON dbo.Urunler.UrunKategoriId = dbo.UrunKategoriler.UrunKategoriId order by
CASE WHEN @orderColumn = 1 AND @orderdir = 'desc' THEN Urunler.UrunAdi END DESC,
CASE WHEN @orderColumn = 1 AND @orderdir = 'asc' THEN Urunler.UrunAdi END asc,
CASE WHEN @orderColumn = 2 AND @orderdir = 'desc' THEN cast(Urunler.UrunFiyati as int) END DESC,
CASE WHEN @orderColumn = 2 AND @orderdir = 'asc' THEN cast(Urunler.UrunFiyati as int) END asc
OFFSET @PageSize * (@PageIndex - 1) ROWS
FETCH NEXT @PageSize ROWS ONLY
END
Ekleyen: cevapsitesi
Değiştiren: cevapsitesi
14.12.16 16:44
Üstteki
SELECT ROW_NUMBER() OVER ( ORDER BY [UrunID] ASC ) AS RowNumber, ..... bölümü, kayıtları UrunID değerine göre sıraladıktan sonra, bu sıraya göre her kayda 1, 2, 3 şeklinde değer verir. Ancak sorgunun devamında CASE'ler ile belirlediğin sıralamada kayıtlar yeniden ve belirttiğin alana göre sıralanıyor. Dolayısıyla RowNumber sıralaması bozuluyor. Ancak sen altta sonuç tablosundaki kayıtları isterken RowNumber'a göre istiyorsun. Sıralama artık buna göre olmadığından beklediğin sonucu alamazsın. Bana göre bunun için en kısa çözüm OVER bölümünü şöyle değiştirmendir. SELECT ROW_NUMBER() OVER
(
ORDER BY (SELECT 0)
) AS RowNumber, ....... Bu, UrunID'ye göre satır numarası vermez ve CASE'ler ile yaptığın sıralamaya göre her kayıt bir RowNumber değeri alır. Son olarak bu şekilde geçici tablolarla sayfalama yapmak yerine SQL Server 2012 kullanıyorsan OFFSET ve FETCH NEXT kullanımını öneririm. Daha az kod yazarsın ve daha yeni bir yöntem. Ekleyen: cevapsitesi