Yazılım.
CevapSitesi.com Beta!
Çözüm Noktası
Facebook, Twitter, Google+ veya e-posta ile paylaşın.
| Sorular | Makaleler | Üyeler | Etiketler  | İletişim
Soru sormak ya da cevap vermek için;
giriş yapın veya üye olun.

Sosyal medya hesaplarınızla da giriş yapabilirsiniz.

Cevap Geçmişi

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

    En fazla 3 eski durum gösterilir.