none
gruplandırma sorunu RRS feed

  • Soru

  • merhaba bir sorgum var örneğin 3+1 / 4+1 / 5+ 1 daire olan birden fazla kaydım var..

    ben hepsini gruplandırmak istedim

    örneğin 5+1 den 10 kayıt varsa bunun toplamını istiyorum

    5+1 = toplamı 150 tane

    3+1 = toplamı 200 tane gibi .....

    sorgum bu şekilde yaptım ve çalıştı 

    SELECT proje.PROJE_ADI, oda.ADI AS ODA_TIPI, COUNT(*) AS ODA_ADET FROM T_TEM_PROJE_BAGIMSIZ_BOLUM bagimsiz

    INNER JOIN T_TEM_PROJE proje ON bagimsiz.PROJE_ID = proje.PROJE_ID LEFT OUTER JOIN T_KOD oda ON bagimsiz.ODA_SAYISI = oda.KOD_ID WHERE proje.PROJE_ID = '566BA77B-73B4-486D-8D3B-248BC50025B1' GROUP BY proje.PROJE_ADI, oda.ADI order by proje.PROJE_ADI

    ancak

    sorguya T_TEM_EKSPERTIZ_ICERIK tablosunu ve T_TEM_PROJE_BAGIMSIZ_BOLUM tablosundan

    2 kolon daha eklemem lazım onun için..

    sorgumu şu şekilde değiştiriyorum ancak her kaydı tek tek gösteriyor

      
    SELECT 
     
           proje.PROJE_ADI,
                  oda.ADI AS ODA_TIPI, COUNT(*) AS ODA_ADET, 
                 icerik.PAZAR_DEGERI as TOPLAM_EKSPERTIZ,
                 bagimsiz.BB_BRUT_M2_ALAN AS KONUT_SATIS_BIRIM_BURUT_M2,
                bagimsiz.TICARET_SATIS_M2 AS TICARET_SATIS_BIRIM_M2
           
          FROM T_TEM_PROJE_BAGIMSIZ_BOLUM bagimsiz
              INNER JOIN T_TEM_PROJE proje ON bagimsiz.PROJE_ID = proje.PROJE_ID           
              LEFT OUTER JOIN T_KOD oda ON bagimsiz.ODA_SAYISI = oda.KOD_ID  
              LEFT OUTER JOIN T_TEM_EKSPERTIZ_ICERIK ICERIK ON icerik.GAYRIMENKUL_ID = bagimsiz.BAGIMSIZ_BOLUM_ID AND icerik.GECERLI = 1     
              WHERE proje.PROJE_ID = '566BA77B-73B4-486D-8D3B-248BC50025B1'
    
              GROUP BY proje.PROJE_ADI, oda.ADI,icerik.PAZAR_DEGERI,bagimsiz.BB_BRUT_M2_ALAN,bagimsiz.TICARET_SATIS_M2 
              order by proje.PROJE_ADI




    • Düzenleyen mustafa3434 10 Temmuz 2013 Çarşamba 13:44
    10 Temmuz 2013 Çarşamba 13:27

Yanıtlar

  • Iki field in toplamlarinin birbirine bolunmesiyle, iki field in birbirine bolumunun toplami farklidir. Sunu dener misiniz

    SUM(TOPLAM_EKSPERTIZ) / SUM(KONUT_SATIS_BIRIM_BURUT_M2) AS KONUT_EKS_ORT_M2 

    • Yanıt Olarak Öneren Passengers 11 Temmuz 2013 Perşembe 13:52
    • Yanıt Olarak İşaretleyen mustafa3434 11 Temmuz 2013 Perşembe 13:54
    11 Temmuz 2013 Perşembe 13:19
  • Merhaba

    O zaman sunu deneyin

    SELECT
    PROJE_ADI,
    DAIRE_TIPI, 
    COUNT(*) AS DAIRE_SAYISI, 
    SUM(TOPLAM_EKSPERTIZ) AS TOPLAM_EKSPERTIZ,
    SUM(KONUT_SATIS_BIRIM_BURUT_M2) AS KONUT_SATIS_BIRIM_BURUT_M2,
    SUM(TICARET_SATIS_BIRIM_M2) AS TICARET_SATIS_BIRIM_M2
    FROM (
    SELECT 
    proje.PROJE_ADI,
    daire.ADI AS DAIRE_TIPI, 
    icerik.PAZAR_DEGERI AS TOPLAM_EKSPERTIZ,
    bagimsiz.BB_BRUT_M2_ALAN AS KONUT_SATIS_BIRIM_BURUT_M2,
    bagimsiz.TICARET_SATIS_M2 AS TICARET_SATIS_BIRIM_M2       
    FROM T_TEM_PROJE_BAGIMSIZ_BOLUM bagimsiz
              INNER JOIN T_TEM_PROJE proje ON bagimsiz.PROJE_ID = proje.PROJE_ID           
              LEFT OUTER JOIN T_KOD daire ON bagimsiz.ODA_SAYISI = daire.KOD_ID  
              LEFT OUTER JOIN T_TEM_EKSPERTIZ_ICERIK ICERIK ON icerik.GAYRIMENKUL_ID = bagimsiz.BAGIMSIZ_BOLUM_ID AND icerik.GECERLI = 1     
              WHERE proje.PROJE_ID = '566BA77B-73B4-486D-8D3B-248BC50025B1'
    ) a
    GROUP BY PROJE_ADI, DAIRE_TIPI 
    order by PROJE_ADI

    • Yanıt Olarak İşaretleyen mustafa3434 11 Temmuz 2013 Perşembe 07:32
    11 Temmuz 2013 Perşembe 06:30
  • Aslinda ben baska turlusunu verdim sana:) Sadece digerlerini de ayni sekilde ekleyeceksin. Neden joinde kullanma:

    Tablo1:

    Id, Deger
    1, 10

    Tablo2:

    Id, Deger2
    1, 10
    1, 20

    Bu durumda:

    select Tablo1.Id, count(tablo2.Deger2) as sayi, sum(tablo2.Deger2) as toplam from ... join ...

    yaparsan sonucta dogru olarak:

    1, 2, 30 alirsin.

    ANCAK, tablo1'de o ID kazara primary key degilse o zaman join coka-cok olabiliyor demektir:

    Tablo1:
    Id, Deger
    1, 1
    1, 2
    1, 3

    girilmisse join sonucu alacagin sonuclar 3 ile carpilacak:

    1, 6, 90

    Nasil olsa benimkiler hep primary key diyebilirsin, sonucta senin kararin:)

    • Yanıt Olarak İşaretleyen mustafa3434 11 Temmuz 2013 Perşembe 16:25
    11 Temmuz 2013 Perşembe 16:18
  • Senin ilk gruplaman proje ve oda'da karsilik gelen sadece birer kayit oldugu icin dogru calisiyordur. Kazara coka-cok iliski olsa sonuclar farkli olacak. Ornek olarak ilkini su sekilde yazsan daha garanti (bunu ikinciye uyarlayabilirsin ama verini ve ne yapmak istedigini sen biliyorsun):

    SELECT  proje.PROJE_ADI ,
            oda.ADI AS ODA_TIPI ,
            sayim.ODA_ADET
    FROM    ( SELECT    proje_id ,
                        ODA_SAYISI ,
                        COUNT(*) AS ODA_ADET
              FROM      T_TEM_PROJE_BAGIMSIZ_BOLUM bagimsiz
              WHERE     proje.PROJE_ID = '566BA77B-73B4-486D-8D3B-248BC50025B1'
              GROUP BY  proje_id ,
                        ODA_SAYISI
            ) sayim
            INNER JOIN T_TEM_PROJE proje ON sayim.PROJE_ID = proje.PROJE_ID
            LEFT OUTER JOIN T_KOD oda ON sayim.ODA_SAYISI = oda.KOD_ID
    ORDER BY proje.PROJE_ADI

    • Yanıt Olarak İşaretleyen mustafa3434 11 Temmuz 2013 Perşembe 07:32
    10 Temmuz 2013 Çarşamba 14:20

Tüm Yanıtlar

  • Emin,

    Her kaydi tek tek gostermiyor, gruplanmis gosteriyor. Brut m2'ler farkli.

    10 Temmuz 2013 Çarşamba 14:03
  • Bu arada, tavsiyem join olan yerde  aggregate fonksiyonlarini kullanma. Once sum(), count() neyse al bir subqueryde veya CTE'de ve onu joinde kullan.
    10 Temmuz 2013 Çarşamba 14:05
  • Senin ilk gruplaman proje ve oda'da karsilik gelen sadece birer kayit oldugu icin dogru calisiyordur. Kazara coka-cok iliski olsa sonuclar farkli olacak. Ornek olarak ilkini su sekilde yazsan daha garanti (bunu ikinciye uyarlayabilirsin ama verini ve ne yapmak istedigini sen biliyorsun):

    SELECT  proje.PROJE_ADI ,
            oda.ADI AS ODA_TIPI ,
            sayim.ODA_ADET
    FROM    ( SELECT    proje_id ,
                        ODA_SAYISI ,
                        COUNT(*) AS ODA_ADET
              FROM      T_TEM_PROJE_BAGIMSIZ_BOLUM bagimsiz
              WHERE     proje.PROJE_ID = '566BA77B-73B4-486D-8D3B-248BC50025B1'
              GROUP BY  proje_id ,
                        ODA_SAYISI
            ) sayim
            INNER JOIN T_TEM_PROJE proje ON sayim.PROJE_ID = proje.PROJE_ID
            LEFT OUTER JOIN T_KOD oda ON sayim.ODA_SAYISI = oda.KOD_ID
    ORDER BY proje.PROJE_ADI

    • Yanıt Olarak İşaretleyen mustafa3434 11 Temmuz 2013 Perşembe 07:32
    10 Temmuz 2013 Çarşamba 14:20
  • merhaba çetin cevap için teşekkür ederim

    eksik anlatmışım 

    burut m2 lerinde toplanması lazım örnek oda adetleri topladım aynı şekilde

    toplam burut m2

    yani 1+1 lerin toplam adeti   toplam bürüt m2 si...

    burut m2 için count sum denedim ama olmadı

    10 Temmuz 2013 Çarşamba 17:42
  • verdiğin sorguyu denedim malesef geçersiz değişken hatası verdi
    10 Temmuz 2013 Çarşamba 17:48
  • SELECT 
    proje.PROJE_ADI,
    oda.ADI AS ODA_TIPI, 
    COUNT(*) AS ODA_ADET, 
    icerik.PAZAR_DEGERI as TOPLAM_EKSPERTIZ,
    SUM(bagimsiz.BB_BRUT_M2_ALAN) AS KONUT_SATIS_BIRIM_BURUT_M2,
    SUM(bagimsiz.TICARET_SATIS_M2) AS TICARET_SATIS_BIRIM_M2
           
    FROM T_TEM_PROJE_BAGIMSIZ_BOLUM bagimsiz
              INNER JOIN T_TEM_PROJE proje ON bagimsiz.PROJE_ID = proje.PROJE_ID           
              LEFT OUTER JOIN T_KOD oda ON bagimsiz.ODA_SAYISI = oda.KOD_ID  
              LEFT OUTER JOIN T_TEM_EKSPERTIZ_ICERIK ICERIK ON icerik.GAYRIMENKUL_ID = bagimsiz.BAGIMSIZ_BOLUM_ID AND icerik.GECERLI = 1     
              WHERE proje.PROJE_ID = '566BA77B-73B4-486D-8D3B-248BC50025B1'
    
    GROUP BY 
    proje.PROJE_ADI, oda.ADI 
    order by proje.PROJE_ADI

    10 Temmuz 2013 Çarşamba 18:38
  • Anlamadim ne degisken hatasi.

    Onlar icin Sum() eklersin de, dedigimi unutma join varsa count(), sum() hatali sonuc vermeye cok acik, kullanma. O ornek uzerinden gidebilirsin.

    10 Temmuz 2013 Çarşamba 18:44
  • merhaba ali teşekkür ederim ancak yine aynı benim yaptığım gibi çıkıyor senin yaptığın tarzı bende şunu denemiştim

     

    SELECT 
    proje.PROJE_ADI,
    daire.ADI AS DAIRE_TIPI, 
    COUNT(*) AS DAIRE_SAYISI, 
     
    SUM(icerik.PAZAR_DEGERI) AS TOPLAM_EKSPERTIZ,
    SUM(bagimsiz.BB_BRUT_M2_ALAN) AS KONUT_SATIS_BIRIM_BURUT_M2,
    SUM(bagimsiz.TICARET_SATIS_M2) AS TICARET_SATIS_BIRIM_M2
           
    FROM T_TEM_PROJE_BAGIMSIZ_BOLUM bagimsiz
              INNER JOIN T_TEM_PROJE proje ON bagimsiz.PROJE_ID = proje.PROJE_ID           
              LEFT OUTER JOIN T_KOD daire ON bagimsiz.ODA_SAYISI = daire.KOD_ID  
              LEFT OUTER JOIN T_TEM_EKSPERTIZ_ICERIK ICERIK ON icerik.GAYRIMENKUL_ID = bagimsiz.BAGIMSIZ_BOLUM_ID AND icerik.GECERLI = 1     
              WHERE proje.PROJE_ID = '566BA77B-73B4-486D-8D3B-248BC50025B1'
    
    GROUP BY proje.PROJE_ADI, daire.ADI ,icerik.PAZAR_DEGERI,bagimsiz.BB_BRUT_M2_ALAN 
    order by proje.PROJE_ADI

    çetin arkadaşımın da dediği biraz yabancı geldi açıkca dediğini beceremedim.

    belki ben anlatamadım

    müşteri adi   soyadı      tutar

    VELİ             KIZIL       20,00 YTL
    Ahmet          YILMAZ    12,50 YTL
    VELİ             KIZIL       30,00 YTL
    VELİ             KIZIL       40,00 YTL
    Ahmet          YILMAZ     5,50 YTL

    ben bu listenin bana şöle çıkmasını istiyorum 
    müşteri adi soyadı tutar
    VELİ   KIZIL    90,00 YTL
    Ahmet YILMAZ 18,00 YTL





    • Düzenleyen mustafa3434 10 Temmuz 2013 Çarşamba 19:32 ASDASDAS
    10 Temmuz 2013 Çarşamba 18:47
  • Merhaba

    O zaman sunu deneyin

    SELECT
    PROJE_ADI,
    DAIRE_TIPI, 
    COUNT(*) AS DAIRE_SAYISI, 
    SUM(TOPLAM_EKSPERTIZ) AS TOPLAM_EKSPERTIZ,
    SUM(KONUT_SATIS_BIRIM_BURUT_M2) AS KONUT_SATIS_BIRIM_BURUT_M2,
    SUM(TICARET_SATIS_BIRIM_M2) AS TICARET_SATIS_BIRIM_M2
    FROM (
    SELECT 
    proje.PROJE_ADI,
    daire.ADI AS DAIRE_TIPI, 
    icerik.PAZAR_DEGERI AS TOPLAM_EKSPERTIZ,
    bagimsiz.BB_BRUT_M2_ALAN AS KONUT_SATIS_BIRIM_BURUT_M2,
    bagimsiz.TICARET_SATIS_M2 AS TICARET_SATIS_BIRIM_M2       
    FROM T_TEM_PROJE_BAGIMSIZ_BOLUM bagimsiz
              INNER JOIN T_TEM_PROJE proje ON bagimsiz.PROJE_ID = proje.PROJE_ID           
              LEFT OUTER JOIN T_KOD daire ON bagimsiz.ODA_SAYISI = daire.KOD_ID  
              LEFT OUTER JOIN T_TEM_EKSPERTIZ_ICERIK ICERIK ON icerik.GAYRIMENKUL_ID = bagimsiz.BAGIMSIZ_BOLUM_ID AND icerik.GECERLI = 1     
              WHERE proje.PROJE_ID = '566BA77B-73B4-486D-8D3B-248BC50025B1'
    ) a
    GROUP BY PROJE_ADI, DAIRE_TIPI 
    order by PROJE_ADI

    • Yanıt Olarak İşaretleyen mustafa3434 11 Temmuz 2013 Perşembe 07:32
    11 Temmuz 2013 Perşembe 06:30
  •  WORLD	3+1		1069	398555986	183562,04	0
     WORLD			8	2970000		0
     WORLD	2+1		1356	530425828,49	173990,78	0
     WORLD	YOK		68	132680370	24753,84
     WORLD	4+1 DUBLEKS	13	9471000	4005,29	0
     WORLD	5+1		88	56875783	24005,52	0
     WORLD	1+1		1104	179185613	74989,92	0
     WORLD	4+1		128	47100122	26213,02	0
     WORLD	5+1 DUBLEKS	20	16027895	6453,12	0
    evet oldu çok teşekkürler ali 
    • Düzenleyen mustafa3434 11 Temmuz 2013 Perşembe 07:33 sdsadd
    11 Temmuz 2013 Perşembe 07:32
  • son bir şey sorsam sorgudaki tabloların id lerinide çıkarmak istedim

    BAGIMSIZ_BOLUM_ID, PROJE_ID, EKSPERTIZ_ICERIK_ID, SATIS_FIYAT_ID

    iç select kısmına yazdım ancak çıkmıyor, üst select e eklediğimde group by hatası alıyorum,group by kısmına eklediğimde zamanda bu sefer yine her kaydı tek tek çıkarıyor

    SELECT PROJE_ADI, DAIRE_TIPI, COUNT(*) AS DAIRE_SAYISI, SUM(TOPLAM_EKSPERTIZ) AS TOPLAM_EKSPERTIZ, SUM(KONUT_SATIS_BIRIM_BURUT_M2) AS KONUT_SATIS_BIRIM_BURUT_M2, SUM(TICARET_SATIS_BIRIM_M2) AS TICARET_SATIS_BIRIM_M2, SUM(TOPLAM_SATIS_FIYATI) AS TOPLAM_SATIS_FIYATI FROM ( SELECT proje.PROJE_ADI, daire.ADI AS DAIRE_TIPI, icerik.PAZAR_DEGERI AS TOPLAM_EKSPERTIZ, bagimsiz.BB_BRUT_M2_ALAN AS KONUT_SATIS_BIRIM_BURUT_M2, bagimsiz.TICARET_SATIS_M2 AS TICARET_SATIS_BIRIM_M2 , SF.SATIS_FIYATI AS TOPLAM_SATIS_FIYATI,

    bagimsiz.BAGIMSIZ_BOLUM_ID, proje.PROJE_ID, icerik.EKSPERTIZ_ICERIK_ID, SF.SATIS_FIYAT_ID FROM T_TEM_PROJE_BAGIMSIZ_BOLUM bagimsiz INNER JOIN T_TEM_PROJE proje ON bagimsiz.PROJE_ID = proje.PROJE_ID LEFT OUTER JOIN T_KOD daire ON bagimsiz.ODA_SAYISI = daire.KOD_ID LEFT OUTER JOIN T_TEM_EKSPERTIZ_ICERIK ICERIK ON icerik.GAYRIMENKUL_ID = bagimsiz.BAGIMSIZ_BOLUM_ID AND icerik.GECERLI = 1 LEFT OUTER JOIN T_SAT_SATIS_FIYAT SF ON bagimsiz.BAGIMSIZ_BOLUM_ID = SF.GAYRIMENKUL_ID AND SF.GECERLI = 1 WHERE proje.PROJE_ID = '566BA77B-73B4-486D-8D3B-248BC50025B1' ) a GROUP BY PROJE_ADI, DAIRE_TIPI order by PROJE_ADI






    • Düzenleyen mustafa3434 11 Temmuz 2013 Perşembe 09:28 zxczx
    11 Temmuz 2013 Perşembe 09:19
  • ID leri eklerseniz gruplamanin bir anlami kalmaz anladigim kadariyla her kayit icin bir ID vardir. O zaman her kaydi tek tek cikarmasi normal. Ama maksimum ID ler gorebilirsiniz gruplayarak. Mesela MAX(BAGIMSIZ_BOLUM_ID) gibi
    11 Temmuz 2013 Perşembe 10:37
  • doğru diyorsunuz haklısınız,ancak yukarıda eksik yazdığım bir yazı var onu buraya ekliyim,eğer bakarsanız sevinirim

    SUM(TOPLAM_EKSPERTIZ) AS TOPLAM_EKSPERTIZ,
    SUM(KONUT_SATIS_BIRIM_BURUT_M2) AS KONUT_SATIS_BIRIM_BURUT_M2,
    
    SUM(TOPLAM_EKSPERTIZ / KONUT_SATIS_BIRIM_BURUT_M2) AS KONUT_EKS_ORT_M2 

    TOPLAM_EKSPERTIZ İLE KONUT_SATIS_BIRIM_BURUT_M2 bölümünden kalan değeri bir kolonda göstermem lazım

    onun için de üsteki select in altına

    SUM(TOPLAM_EKSPERTIZ / KONUT_SATIS_BIRIM_BURUT_M2) AS KONUT_EKS_ORT_M2 

    ekledim...

    ancak sorun şuki çıkan değer saçma sapan bir şey oluyor

    örneğin

    x bir satırın

     TOPLAM EKSPERTIZI = 398555986

    KONUT_SATIS_BIRIM_BURUT_M2 = 183562,04 

    398555986 / 183562,04  = 2171,23314820428    çıkması gerekirken 

    KOLONDA : 2328978,64786686129079924636238956623777 

    gibi bir rakam çıkıyor

    tekrar teşekkürler


    • Düzenleyen mustafa3434 11 Temmuz 2013 Perşembe 11:57 ASDASD
    11 Temmuz 2013 Perşembe 11:54
  • Emin,

    Ben gene uyarayim, joinli tablolarda aggregate kullanma.

    11 Temmuz 2013 Perşembe 12:20
  • merhaba teşekkürler ancak başka bir türlü aklıma gelmiyorki
    11 Temmuz 2013 Perşembe 12:35
  • Iki field in toplamlarinin birbirine bolunmesiyle, iki field in birbirine bolumunun toplami farklidir. Sunu dener misiniz

    SUM(TOPLAM_EKSPERTIZ) / SUM(KONUT_SATIS_BIRIM_BURUT_M2) AS KONUT_EKS_ORT_M2 

    • Yanıt Olarak Öneren Passengers 11 Temmuz 2013 Perşembe 13:52
    • Yanıt Olarak İşaretleyen mustafa3434 11 Temmuz 2013 Perşembe 13:54
    11 Temmuz 2013 Perşembe 13:19
  • evet oldu çok yardımcı oldunuz çok teşekkürler
    11 Temmuz 2013 Perşembe 13:54
  • Aslinda ben baska turlusunu verdim sana:) Sadece digerlerini de ayni sekilde ekleyeceksin. Neden joinde kullanma:

    Tablo1:

    Id, Deger
    1, 10

    Tablo2:

    Id, Deger2
    1, 10
    1, 20

    Bu durumda:

    select Tablo1.Id, count(tablo2.Deger2) as sayi, sum(tablo2.Deger2) as toplam from ... join ...

    yaparsan sonucta dogru olarak:

    1, 2, 30 alirsin.

    ANCAK, tablo1'de o ID kazara primary key degilse o zaman join coka-cok olabiliyor demektir:

    Tablo1:
    Id, Deger
    1, 1
    1, 2
    1, 3

    girilmisse join sonucu alacagin sonuclar 3 ile carpilacak:

    1, 6, 90

    Nasil olsa benimkiler hep primary key diyebilirsin, sonucta senin kararin:)

    • Yanıt Olarak İşaretleyen mustafa3434 11 Temmuz 2013 Perşembe 16:25
    11 Temmuz 2013 Perşembe 16:18