none
Sql İç İçe Sorgu Yardımı RRS feed

  • Soru

  • Merhabalar,

    iki tablom var,

    biri araçlar(aracId,aracmarkamodel,sistemKayitKmSi aracplaka, kmbilgisi, sil) diğeri hareket(hareketıd, aracıd, teslimkm, yapilankm),

    senaryo;

    araçlar tahsis edildikçe araç hareket tablosuna yazılıyor. Ben dbo.araclar.Sil=False  olan tüm araçların en son yaptıkları teslim km bilgisini almak istiyorum

    bir çok kayıt çıkıyor büyük kayıtı alamıyorum. eğer araç hiç alınmadıysa sistem kayitkm si gösterilecek.

    iki tabloyu birleştirdiğimde en büyüğünü alıyorum bu sefer hiç yapmamış olan çıkmıyor

    23 Ekim 2015 Cuma 15:04

Yanıtlar

  • WITH  hareketler
            AS (
                 SELECT MAX(hareketId) AS hareketId, aracid
                 FROM   hareket
                 GROUP BY aracId
               ),
          sonKm
            AS (
                 SELECT h.aracId, h.yapilanKm
                 FROM   hareket h
                 INNER JOIN hareketler h2 ON h.aracId = h2.aracId AND
                                             h.hareketId = h2.hareketId
               )
      SELECT  arc.*, COALESCE(sk.yapilanKm, arc.sistemKayitKmsi) AS yapilanKm
      FROM    araclar arc
      LEFT JOIN sonKm sk ON arc.aracId = sk.aracId
      WHERE   arc.Sil = 0;
    
    Not: Alan adlarini yazarken pek dikkat etmedim.
    23 Ekim 2015 Cuma 15:50

Tüm Yanıtlar

  • WITH  hareketler
            AS (
                 SELECT MAX(hareketId) AS hareketId, aracid
                 FROM   hareket
                 GROUP BY aracId
               ),
          sonKm
            AS (
                 SELECT h.aracId, h.yapilanKm
                 FROM   hareket h
                 INNER JOIN hareketler h2 ON h.aracId = h2.aracId AND
                                             h.hareketId = h2.hareketId
               )
      SELECT  arc.*, COALESCE(sk.yapilanKm, arc.sistemKayitKmsi) AS yapilanKm
      FROM    araclar arc
      LEFT JOIN sonKm sk ON arc.aracId = sk.aracId
      WHERE   arc.Sil = 0;
    
    Not: Alan adlarini yazarken pek dikkat etmedim.
    23 Ekim 2015 Cuma 15:50
  • hocam alanları uyarladım son hali bu şekilde ;

    WITH  hareketler
            AS (
                 SELECT MAX(HareketId) AS HareketId, AracId
                 FROM   dbo.Hareket
                 GROUP BY AracId
               ),
          sonKm
            AS (
                 SELECT h.AracId, h.YapilanKm
                 FROM   dbo.Hareket h
                 INNER JOIN hareketler h2 ON h.AracId = h2.AracId AND
                                             h.HareketId = h2.HareketId
               )
      SELECT  arc.*, COALESCE(sk.YapilanKm, arc.Km_Bilgisi) AS YapilanKm
      FROM    Araclar arc
      LEFT JOIN sonKm sk ON arc.AracId = sk.AracId
      WHERE   arc.Sil = 0;

    ama şu şekilde bir hata dönüyor

    Msg 245, Level 16, State 1, Line 1
    Conversion failed when converting the nvarchar value '100.000' to data type int.

    23 Ekim 2015 Cuma 16:05
  • nvarchar value '100.000'

    Bu da ne :) Sen nasil boyle bir hata yaptin da 100000 gibi bir sayiyi nvarchar alana koydun? Ona gore duzelt SQL'i de, asil duzeltmeyi tablolarinda yapman gerekiyor.

    SQL'de gecici duzeltme icin soyle bir sey yazabilirsin (unutma GECICI):

    cast( replace(arc.Km_bilgisi, '.', '') as int ) 

    Not: nvarchar olan kolon Km_bilgisi ise. 

    23 Ekim 2015 Cuma 16:16
  • hocam hakikaten dediğiniz gibiymiş plaka kolonunu oluştururken hızlıca geçince sanırım onuda aynı veri tipinde yapmışım :) 2 kayıt vardı hocamda null yapıp değiştirdim sorgu çalışıyor sorunsuz olarak çok teşekkürler hocam nette bu tip bir örnek yoktu buda ilki olmuş oldu umarım ihtiyacı olan herkes bu bilginizden faydalanmış olacaktır.
    23 Ekim 2015 Cuma 16:23
  • ... hocam nette bu tip bir örnek yoktu buda ilki olmuş oldu...

    Lütfen genelleme yapmayalım :)

    CTE SQL şeklinde aratırsan sayfalarca örnek bulabilirsin. Ayrıca Çetin abi forumda bir çok defa benzer örnekler verdi.

    23 Ekim 2015 Cuma 16:31
    Moderatör
  • Evet :)

    Ben de uzun zamandir, isin kolayina kacip subquery yerine CTE ile yaziyorum ve tonlarca ornegi de onunla verdim ama onlarin oldugu yerler denizde (net) damla bile olmadigindan gozden kaciyor demek ki :) 

    23 Ekim 2015 Cuma 16:39
  • ... hocam nette bu tip bir örnek yoktu buda ilki olmuş oldu...

    Lütfen genelleme yapmayalım :)

    CTE SQL şeklinde aratırsan sayfalarca örnek bulabilirsin. Ayrıca Çetin abi forumda bir çok defa benzer örnekler verdi.

    hocam ben paso sql iç içe sorgu şeklinde arattım hem burada hem net ortamında  o yüzden sanırım bulamadım :)
    23 Ekim 2015 Cuma 17:16