Group By Hatası:

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
stnonstop
Üye
Mesajlar: 149
Kayıt: 22 Haz 2005 04:34

Group By Hatası:

Mesaj gönderen stnonstop »

SQL Joinleri vs ile aram pek yoktur. Fakat bir türlü çözemedim buradaki group by da hata nedir ??

select * from MUSTERI M join HEDIYE_HAREKET H on M.MUSTERI_ID = H.MUSTERI_ID group by M.MUSTERI_ID

MUSTERI_ID adında bir filedim var fakat yinede hata alıyorum acaba sorun nedir neyi gözden kaçırıyorum ????

Hata: Invalid Expression in the select list (not contained in either an anggregate function or the GROUP BY clause)
St. NonStop
Aziz DURMAZ
Elektronik ve Haberleşme Mühendisi
stnonstop
Üye
Mesajlar: 149
Kayıt: 22 Haz 2005 04:34

Mesaj gönderen stnonstop »

Kısacası yapmak istediğim şu
select * from MUSTERI M join HEDIYE_HAREKET H on M.MUSTERI_ID = H.MUSTERI_ID sorgusu ile

ID
----
201
122
201
93

gibi veriler elde ediyorum. Benim istediğim ise

ID
---
201
122
93

Belli bir kolontaki yinemeli kayıt varsa bunları tek bir kayıt olarak göstermek istiyorum..
St. NonStop
Aziz DURMAZ
Elektronik ve Haberleşme Mühendisi
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Group by kullanıyorsanız eğer select ile seçtiğiniz tüm alanları group by ın yanına yazmanız lazım.

Kod: Tümünü seç


select M.MUSTERI_ID  from MUSTERI M join HEDIYE_HAREKET H on M.MUSTERI_ID = H.MUSTERI_ID group by M.MUSTERI_ID 
bu şekilde hata vermez.
stnonstop
Üye
Mesajlar: 149
Kayıt: 22 Haz 2005 04:34

Mesaj gönderen stnonstop »

Kod: Tümünü seç

select M.MUSTERI_ID, M.MUSTERI_KOD, M.MUSTERI_SMC  from MUSTERI M join HEDIYE_HAREKET H on M.MUSTERI_ID = H.MUSTERI_ID group by M.MUSTERI_ID 
dediğimde ise gene çalışmıyor :(

Eğer tüm alanları group byın yanına yazarsam ne farkı kalacak normal select ten ???
St. NonStop
Aziz DURMAZ
Elektronik ve Haberleşme Mühendisi
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Grup un amacı genelde bir veya bir kaç alanı sabit tutarak, toplam (SUM) almak için kullanılabilir. Dolaysıyla da

Kod: Tümünü seç

select adi, soyadi, sum(tutar) from tablo
group by adi, soyadi
şeklindeki bir select de SUM alınan alan haricindekilerin group by dan sonra yazılması gerekir :idea: Herhangi bir fonksiyon kullanmıyorsan gruplamanın da bir anlamı kalmaz :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
Ben de sizin gibi join i pek kullanmadım. Ama eğer join ile birlikte kullanılabiliyorsa Distinct i kullanırsanız işiniz görülebilir. Örneğin

Kod: Tümünü seç

select distinct(high)  from spt_values
şeklinde bir kod girerseniz high kolonunda ne kadar 1 varsa bir tane görünür, ne kadar 25600 varsa bir tane görünür ...

Kodunuzu distinct ile kullanmayı bir deneyin derim.

Kolay gelsin.
stnonstop
Üye
Mesajlar: 149
Kayıt: 22 Haz 2005 04:34

Mesaj gönderen stnonstop »

Hocam kusura bakmayın ben daha öncede 5 sene MySQL ile çalışmış birisi olarak IB veya Firebirddeki SQL mantığındaki değişikliklere adepte olmakta zorlanıyorum.


MySQL bu sonucu almak için

Kod: Tümünü seç

select * from MUSTERI as M, HEDIYE as H where M.MUSTERI_ID = H.MUSTERI_ID group by M.MUSTERI_ID
dediğimde müşteri ID sine göre gruplandırılmış tüm lsiteyi alabilirdim. Birden fazla kayıt olduğunda ise ilk kayıtları almış olurum.

FireBird e ise bu işlemi ancak..

Kod: Tümünü seç

SQL  = "select M.MUSTERI_ID, ";
    SQL += "       M.MUSTERI_NO, ";
    SQL += "       M.MUSTERI_KOD, ";
    SQL += "       M.MUSTERI_AD, ";
    SQL += "       M.MUSTERI_ADRES, ";
    SQL += "       M.MUSTERI_VD, ";
    SQL += "       M.MUSTERI_VN, ";
    SQL += "       M.MUSTERI_SMC ";
    SQL += "from MUSTERI M join HEDIYE_HAREKET H on M.MUSTERI_ID = H.MUSTERI_ID ";
    SQL += "group by M.MUSTERI_ID, ";
    SQL += "         M.MUSTERI_NO, ";
    SQL += "         M.MUSTERI_KOD, ";
    SQL += "         M.MUSTERI_AD, ";
    SQL += "         M.MUSTERI_ADRES, ";
    SQL += "         M.MUSTERI_VD, ";
    SQL += "         M.MUSTERI_VN, ";
    SQL += "         M.MUSTERI_SMC ";
    SQL += "order by M.MUSTERI_NO";
Bu kadar uzunbir kod yazark elde ediyorum. Mantık olarakda anlamsız geliyor bir sürü grubu sorguya sokmak. Kaldı ki Hediye ile ilgili bir bilgide alamıyorum çünkü (Buradaki sorguda gerek yok) Hediye tablosundan bir veri almaya kalkışsam işler iyicene karışacak. Tablo ilişki yapılandırmam sayesinde işi kurtardım.
St. NonStop
Aziz DURMAZ
Elektronik ve Haberleşme Mühendisi
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

hata vermemsi için

Kod: Tümünü seç

select M.MUSTERI_ID, M.MUSTERI_KOD, M.MUSTERI_SMC  from MUSTERI M join HEDIYE_HAREKET H on M.MUSTERI_ID = H.MUSTERI_ID group by M.MUSTERI_ID, M.MUSTERI_KOD, M.MUSTERI_SMC
olması lazım. Gruplamanın anlamı bu zaten. Şöyle anlatayım:

Kod: Tümünü seç

A     B     
----------
A1   B1
A2   B1 
A2   B2 
Burda A alanına göre gruplama yaparsan eğer A1 ve A2 olarak iki satır getirecektir, eğer B yi de görmek istersen grupladığı A2 satırında hangi B satırını getirecek? B1 i mi B2 yi mi? Ya sadece A ya göre gruplayıp A1 ve A2 olarak iki satır göreceksin ve B yi göremeyeceksin ya da B yi görmek istiyorsan eğer B ye göre de gruplayacaksın, tabi bu durumda dönen sonuç 3 satır olacaktır.
stnonstop
Üye
Mesajlar: 149
Kayıt: 22 Haz 2005 04:34

Mesaj gönderen stnonstop »

MySQL bunu çok güzel çözmüş ilk kayıtı getiriyor :)
Tablolarımız diyelimki 1 alandeğil daha fazla alandan oluşuyor

A Tablosu B Tablosu
------------ --------------
A1 X2 B1
A1 X1 B2
A2 X3 B3
A3 X3 B2

Ben şimdi A1 A2 A3 grublandırmak istesem gruplandıramayıcam çünkü X ler işi bozacak. :) Sonuçta ben illaki fonkiyon mu kullanmalıyım grouplandırma yapmam için faklı bir amaç için kullanamazmıyım.

Not * problemimi çözdüm sadece anlamak idrak etmek için soruyorum.
St. NonStop
Aziz DURMAZ
Elektronik ve Haberleşme Mühendisi
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Kod: Tümünü seç

SELECT A, MIN(X), B FROM T1,T2 GROUP BY A,B
stnonstop
Üye
Mesajlar: 149
Kayıt: 22 Haz 2005 04:34

Mesaj gönderen stnonstop »

Yani illaki bir fonksiyon kullanacaz fonksiyon kullanmadıklarımızıda groupbun içine alacağız. Fakat şöyle bir durum ortaya çıkıyor. Min max veya sum kullanarak açığa çıkan sonuçlar benim db de ham halinde olan satırların aynısı olmaya bilir.

Az önce ki örnekten gitmek gerekirse;

Kod: Tümünü seç

SELECT A, MIN(X), MIN(B) FROM T1 GROUP BY A
Yazdığımızda bize sonuç olarak dönen satır
A1 X1 B1
A2 X3 B3
A3 X3 B2

olacaktır fakat bizim ham haldeki satırlarımızın hiçbirinde A1 X1 B1 şeklinde bir satır yok. ?????
St. NonStop
Aziz DURMAZ
Elektronik ve Haberleşme Mühendisi
Cevapla