+ Yanıtla
Toplam 7 sonuçtan 1 ile 7 arası olanlar

Konu Başlığı: tek sql sorguda iki koşul gruplama

  1. #1

    tek sql sorguda iki koşul gruplama

    Merhabalar
    Örnek bir tablom var adı Tablo1
    isim,satis adında 2 kolon var.

    tablo içinde
    isim Satis
    Ali 1
    Ali 2
    Ali 2
    Ali 1
    Ali 2
    Veli 2
    Veli 2
    Veli 1
    Veli 2
    Veli 2
    Veli 1
    Veli 1

    veriler var. Satış sonuçları tek kolonda listeleniyor.

    Select isim,Count(isim) as SatisBir From Tablo1 Where Satis = 1 Group By isim
    yazdığımda satışı 1 olanları aşağıdaki gibi listeliyorum.
    isim SatisBir
    Ali 2
    Veli 3

    Select isim,Count(isim) as SatisIki From Tablo1 Where Satis = 2 Group By isim
    yazdığımda satışı iki olanları yine aşağıdaki gibi listeliyorum.
    isim Satisıki
    Ali 3
    Veli 4

    Ama ben iki sonucu tek sorguda almak istiyorum. Yani sorgu sonucunda

    isim SatisBir SatisIki
    Ali 2 3
    Veli 3 4

    sonucunu almak istiyorum.

    Benim denedğim sorgu
    Select isim,
    (Select count(isim) From Tablo1 Where satis = 1 Group by isim) as satisbir,
    (Select count(isim) From Tablo1 Where satis = 2 Group by isim) as satisIki
    From Tablo1
    Group by isim

    tabi çalışmadığı için burdayım

    tşk.

  2. #2
    Kod:
    select isim
            , sum(satis_1)
            , sum(satis_2) 
      from (select isim
                         , if(satis=1,1,0) satis_1
                         , if(satis=2,1,0) satis_2
                   from satis s) s
    group by isim
    Ilk once satisi 1 ve 2 olanlari ayri kolonlara ayiriyorsun (pivoting'in ilk adimi gibi). Daha sonra hepsine 1 yazdirdigin icin topluyorsun (count dersen 0'lari da sayar).

    Ikinci bir yol da
    Kod:
    select isim
            , sum(satis_1)
            , sum(satis_2) 
      from (select isim
                         , if(satis=1,count(isim),0) satis_1
                         , if(satis=2,count(isim),0) satis_2
                   from satis s
            group by isim, satis) s
    group by isim
    Burada da ilk once sayma islemini yapiyoruz, daha sonra iki ayri kolonda sayilmis veriyi bir alttaki 0'la topluyoruz.

    Ilki daha fazla veriyi isler. Ikincisiyse daha ilk adimda sayma islemini yaptigi icin, dis select'e sadece bos satirlari toplama isi verir (icteki sorgulari tek tek calistirirsan demek istedigim daha anlasilir olur). Hangisini kullanacagin sana kalmis. Eger sayma islemi disinda baska isler de yapiyorsan, ilki daha kullanisli olur sanirim, ama dedigim gibi ikincisi daha performansli olacaktir.

  3. #3
    Alıntı bgul tarafından gönderilen mesaj: Mesajı Göster
    Kod:
    select isim
            , sum(satis_1)
            , sum(satis_2) 
      from (select isim
                         , if(satis=1,1,0) satis_1
                         , if(satis=2,1,0) satis_2
                   from satis s) s
    group by isim
    Ilk once satisi 1 ve 2 olanlari ayri kolonlara ayiriyorsun (pivoting'in ilk adimi gibi). Daha sonra hepsine 1 yazdirdigin icin topluyorsun (count dersen 0'lari da sayar).

    Ikinci bir yol da
    Kod:
    select isim
            , sum(satis_1)
            , sum(satis_2) 
      from (select isim
                         , if(satis=1,count(isim),0) satis_1
                         , if(satis=2,count(isim),0) satis_2
                   from satis s
            group by isim, satis) s
    group by isim
    Burada da ilk once sayma islemini yapiyoruz, daha sonra iki ayri kolonda sayilmis veriyi bir alttaki 0'la topluyoruz.

    Ilki daha fazla veriyi isler. Ikincisiyse daha ilk adimda sayma islemini yaptigi icin, dis select'e sadece bos satirlari toplama isi verir (icteki sorgulari tek tek calistirirsan demek istedigim daha anlasilir olur). Hangisini kullanacagin sana kalmis. Eger sayma islemi disinda baska isler de yapiyorsan, ilki daha kullanisli olur sanirim, ama dedigim gibi ikincisi daha performansli olacaktir.

    hata verdi,

    Msg 156, Level 15, State 1, Line 5
    Incorrect syntax near the keyword 'if'.
    Msg 102, Level 15, State 1, Line 5
    Incorrect syntax near ','.
    Msg 102, Level 15, State 1, Line 6
    Incorrect syntax near ','.

  4. #4
    MySQL mi kullaniyosun, MSSQL mi, Oracle mi veya baska bir sey mi? Ayrica versiyonu ne?

  5. #5
    if(satis=1,1,0) yerine

    SQL server & MySQL için : case when satis=1 then 1 else 0 end

    ORACLE için : decode(satis, 1, 1, 0)

    ek: aşağıdaki şekilde kullanımı da mevcutmuş.
    case satis when 1 then 1 else 0 end
    "oturduğum mahallenin yolları çamurluydu, boyalı ayakkabı giysem bile, o yollardan geçtikten sonra çamurlanmamaları mümkün değildi. hayatım da böyle." yılmaz güney
    http://www.sipidik.com

  6. #6
    Alıntı absconder tarafından gönderilen mesaj: Mesajı Göster
    if(satis=1,1,0) yerine

    SQL server & MySQL için : case when satis=1 then 1 else 0 end

    ORACLE için : decode(satis, 1, 1, 0)

    ek: aşağıdaki şekilde kullanımı da mevcutmuş.
    case satis when 1 then 1 else 0 end

    Teşk.

    Doğru sorgu,

    select isim
    , count(satis_1) as satis1
    , count(satis_2) as satis2
    from (select isim
    , case satis when 1 then 1 end satis_1
    , case satis when 2 then 2 end satis_2
    from Tablo1 s) s
    group by isim

  7. #7
    count kullanmani tavsiye etmem. Hatta case kullandigin zaman else kismini da koyman gerektigini dusunuyorum. Bunlar tabi tavsiyedir; ben ellemiyim, ilerde bozulunca gelir yine konu acarsin, biz yine yardimci oluruz.

+ Yanıtla

Bu konu başlığı için etiketler

Mesaj Seçenekleri

  • Yeni başlık açamazsınız
  • Cevap yazabilirsiniz
  • Dosya ekleyemezsiniz
  • Mesajlarınızı değiştiremezsiniz