none
MSSQL 2017 -Group by- hakkında RRS feed

  • Soru

  • Merhaba, mssql 2017 kullanıyorum. Group by fonksiyonunu istediğim gibi kullanamıyorum. İki tablom var ve bu tablolarımda 10 dan fazla kolonlar var. 1 Tablomun primarykey ile 2 tablomun foreignkeyleri ile gruplama yapıp bütün alanları listelemek istiyorum.

    ÖRNEK;

    SELECT * FROM TBLOne as ONE INNER JOIN TBLTwo as TWO on ONE.ID=TWO.TWOID Group by TWO.TWOID

    Aldığım Mesaj;

    Column 'TBLTwo.BLABLANAME' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

    Bu durumda bütün kolonlarımı grup by içine dahil etmem gerekiyor ve bu benim istediğim sonucu vermiyor. Çünkü ben sadece bir alana göre gruplamak istiyorum. Yardım eder misiniz?


    • Düzenleyen firatin 19 Nisan 2018 Perşembe 08:29
    19 Nisan 2018 Perşembe 08:25

Tüm Yanıtlar

  • Selam,

    Group by ONE.ID olarak yazabilirmisin? Olmaz ise Tablo Görseli atarsan yardımcı olabilirim.

    İyi Çalışmalar

    • Yanıt Olarak İşaretleyen firatin 19 Nisan 2018 Perşembe 09:10
    • Yanıt İşaretini Geri Alan firatin 19 Nisan 2018 Perşembe 09:10
    19 Nisan 2018 Perşembe 08:33
  • Görsel eklemeye çalıştım fakat sorunla karşılaştım. Hesabımdan görsel yükleyemedim.

    Aklıma gelen bütün varyosyonları denedim. SUM ve AVG ile listelediğim kolonlar dışında hepsi için ONE.ID,Two.Id,ONE.Name,Two.Name gibi bütün alanların yazılmasını istiyor. Bu da istediğim sonucu vermiyor.

    19 Nisan 2018 Perşembe 09:10
  • Grup by sizin istediğiniz gibi çalışmaz.

    Elinizdeki AD, SOYAD , CINSIYET, DOGUMYERIID  gibi dört kolonlu basit bir tablo olsun. Bunu CINSIYET kolonuna göre gruplarsanız.

    SELECT CINSIYET FROM KISI GROUP BY CINSIYET

    Sonuçta 2 adet satır olacaktır. Ama siz sorguyu şöyle yazmaya çalışıyorsunuz :

    SELECT CINSIYET, AD FROM KISI GROUP BY CINSIYET

    Bu ad kolonuna sql'in bir şey getirmesi mümkün olmayacaktır.

    Peki siz aslında DOGUMYERIID  'ye göre gruplayıp bu şehrin adını yazmak isterseniz? Bu durumda yukarıdaki mantığı bozmadan iç içe sorgular yazmanız gerekecektir.

    SELECT [S].[SEHIRADI]
    FROM (
        SELECT [K].[DOGUMYERIID]
        FROM [KISI] AS [K]
        GROUP BY [K].[DOGUMYERIID]
        ) AS [G]
    INNER JOIN [SEHIR] AS [S] ON [S].ID = [G].[DOGUMYERIID]


    www.cihanyakar.com


    19 Nisan 2018 Perşembe 11:13
  • Merhaba Cihan, bahsettiğin gibi kullanmaya çalıştım fakat group by yine diğer alanlardan dolayı istediğim sonucu vermiyor. Eğer böyle de çözemezsem fonksiyon kullanıp denerim. Gün boyu araştırıp uğraştım ama istediğim raporu alamadım. Teşekkür ederim.
    19 Nisan 2018 Perşembe 15:08
  • Biraz geç olacak ama mevcut sorgunu geliştirebilirsin belki ; 

    sqlde sadece group by ile gruplama yapılmaz birden fazla yolları mevcutdur ben sadece isimlerini vereyim sen uygun olanlarını kullanırsın . 

    • Grouping Sets(yazdığın kolonları daha iyi bir performans ile gruplar)
    • Group By Cube(Yazdığın kolon isimlerini olabilecek tüm varyasyonlarda gruplar)
    • Rollup(Cube ye göre tüm varyasyonları değil sadece düzgün sırada bir gruplama sağlar Örnek ;Rollup(a,b,c) sadece 4 grup set üretir, a>b>c hiyerarşisini göz önünde bulundurur ve  grup setlerinde  Grouping Sets ( (a,b,c), (a,b) ,(a),() ) ifadesine eşit bir sonuç üretir.

    Sorgu içerisinde kolonlarına Grouping(kolon adı )  da diyebilirsin ;
    Select  Grouping(Cinsiyet) as cinsiyet from Kimlik_Bilgileri gibi 

    Diğer yazdığım maddeler veriyi gruplamak için sana çok esnek özellikler sunuyor. Ek olarak klasik group by ile belki birden fazla subquery yazman gerekirken bu şekilde tek sorguda işini hallettiğin için performansın gözle görülür şekilde artıyor.



    Altan Özdemir

    28 Mayıs 2018 Pazartesi 14:52
  • @Altan, bunlar çoğu programcı tarafından bilinmeyen güzel SQL özellikleri. Forumda yer verdiğin için teşekkürler.

    Fakat, sonradan okuyacak arkadaşlar için bir iki düzeltmem olacak.

    1. Groupping set, basit group by sorgularını hızlandırmak için kullanılmaz. Birden fazla gruplamanın birleştirilmek istendiği durumlarda hem performans hem de kısa yazım için kullanılır.

    2. Grouping(Cinsiyet)... kısmını açıklamamışsın. Bu fonksiyon CUBE ve ROLLUP kullanıldığında nullable alanlarda yaşanan karışıklığı gidermek için kullanılır. Örneğin "Cinsiyet" e göre gruplama yapıldığında Cinsiyet kolonun da 4 değer olacaktır. Null, Erkek, Kadın, Null ... Buradaki ilk null cinsiyet değeri girilmemiş değerleri; ikinci null tüm cinsiyet değerlerini (tek kolon olduğu için şartları sağlayan tüm kayıtları) simgeler. Hangisinin hangisi olduğu da Groupping fonksiyonu ile anlaşılabilir.


    www.cihanyakar.com

    28 Mayıs 2018 Pazartesi 21:14
  • @Cihan Eksik ve hatalı anlatımı düzelttiğin için teşekkür ederim . Dediğin gibi bunları çoğu kişi bilmiyor . Bende az çok bilenler arasındayım ve görünce paylaşmak istedim . 


    Altan Özdemir

    29 Mayıs 2018 Salı 06:09
  • www.t-sqlquery.com 
    7 Haziran 2018 Perşembe 07:59