group by karısıklıgı

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
skyking
Üye
Mesajlar: 136
Kayıt: 09 Kas 2005 12:52
Konum: Antalya

group by karısıklıgı

Mesaj gönderen skyking »

slm arkadaslar

bir sorgum var ve uyuz oldum mysql de calsıyor ama sql serverda
yapamadım yani ben sadece DB_MASKOD gore gruplasın istiyorum


SELECT DB_maskod,DB_MARKA,DB_MODEL,DB_TIP,DB_ADI,(altgrp.ad) altad FROM DBKART
INNER JOIN altgrp on
dbkart.db_grupkodu=altgrp.akod and dbkart.db_altkod=altgrp.kod
GROUP BY DB_MASKOD ORDER BY dbkart.db_altkod,DB_ADI,DB_TIP



nasıl bir yol izlemem gerekiyor?
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Eğer group by kullanıyorsanız select ile seçtiğiniz alanları ya group by da gruplamalısınız ya da alanları sum,count,min gibi bir fonksiyon ile gruplamalısınız. Yani sizin kodunuz ya şu şekilde olmalı:

Kod: Tümünü seç

SELECT DB_maskod,DB_MARKA,DB_MODEL,DB_TIP,DB_ADI,(altgrp.ad) altad FROM DBKART
INNER JOIN altgrp on
dbkart.db_grupkodu=altgrp.akod and dbkart.db_altkod=altgrp.kod
GROUP BY DB_maskod,DB_MARKA,DB_MODEL,DB_TIP,DB_ADI,altgrp.ad ORDER BY dbkart.db_altkod,DB_ADI,DB_TIP 
ya da

Kod: Tümünü seç

SELECT DB_maskod,min(DB_MARKA),min(DB_MODEL),min(DB_TIP),min(DB_ADI),min(altgrp.ad) altad FROM DBKART
INNER JOIN altgrp on
dbkart.db_grupkodu=altgrp.akod and dbkart.db_altkod=altgrp.kod
GROUP BY DB_maskod ORDER BY dbkart.db_altkod,DB_ADI,DB_TIP 
mantıken düşünecek olursanız, bir alana göre grupladığınızda diğer alanı da seçmek istediğinizde eğer farklı iki değer varsa hangisini getirmesini bekliyorsunuz?

Yani şöyle düşünün:

alan1 alan2
1 a
1 b

alan1 e göre grupladınız ve 1 değerleri gruplanarak tek satır olarak dönüyor, e bana gruplamadığım alan2 yi de ver derseniz hangi değer getirecek? a yı mı b yi mi?

Umarım anlatabilmişimdir..
Kullanıcı avatarı
skyking
Üye
Mesajlar: 136
Kayıt: 09 Kas 2005 12:52
Konum: Antalya

Mesaj gönderen skyking »

cvp için tesekkurler

ama benim istedigim diyelikki basit bir örnek vericem
anakartlar var markaları,ve modelleri,serinosu,ismi var

ben diyorumki sadece anakartların su markasına gore listele
ve cıkan sonucta diger bilgilerinde gelmesini istiyorum diger bilgilerin ister grubun en bastaki ister en sondaski olabilir
anlatabildimmi acaba?
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Markaya göre listeletmek için group yapmana gerek yok. Where içinde istediğin markanın kodunu parametre olarak alıp sadece o markadakileri listeletebilirsin..
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
skyking
Üye
Mesajlar: 136
Kayıt: 09 Kas 2005 12:52
Konum: Antalya

Mesaj gönderen skyking »

hocam salon ama ben butun girilmiş markalara gore gruplamak istemistim neyse ben bir sekilde cozdum ama cok uzun sql cunlesi kulanıyorum alısmısım mysql e ondan oluyor

select * from girisler group by marka dedigimde markaya gore sıkalıyordu ondan olsa gerek yardımlarınız için tessekkurler
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

skyking yazdı: ben diyorumki sadece anakartların su markasına gore listele
ve cıkan sonucta diger bilgilerinde gelmesini istiyorum diger bilgilerin ister grubun en bastaki ister en sondaski olabilir
anlatabildimmi acaba?
İşte demekki bu dediğini mysql birşekilde izin veriyor ve artık neye izin verdiyse onu getiriyor. Ozaman sen de benim yazdığım 2. kodu kullanacaksın ve elinle max veya min diyeceksin, ozaman diğer fieldların için en büyük değeri veya en küçük değeri verecek. Eğer iç içe select ile çözdüysen daha yavaş çalışır haberin olsun ;)
Kullanıcı avatarı
DarkEternal
Üye
Mesajlar: 158
Kayıt: 19 Eki 2005 11:00

Mesaj gönderen DarkEternal »

naile yazdı:Eğer group by kullanıyorsanız select ile seçtiğiniz alanları ya group by da gruplamalısınız ya da alanları sum,count,min gibi bir fonksiyon ile gruplamalısınız. Yani sizin kodunuz ya şu şekilde olmalı:

Kod: Tümünü seç

SELECT DB_maskod,DB_MARKA,DB_MODEL,DB_TIP,DB_ADI,(altgrp.ad) altad FROM DBKART
INNER JOIN altgrp on
dbkart.db_grupkodu=altgrp.akod and dbkart.db_altkod=altgrp.kod
GROUP BY DB_maskod,DB_MARKA,DB_MODEL,DB_TIP,DB_ADI,altgrp.ad ORDER BY dbkart.db_altkod,DB_ADI,DB_TIP 
ya da

Kod: Tümünü seç

SELECT DB_maskod,min(DB_MARKA),min(DB_MODEL),min(DB_TIP),min(DB_ADI),min(altgrp.ad) altad FROM DBKART
INNER JOIN altgrp on
dbkart.db_grupkodu=altgrp.akod and dbkart.db_altkod=altgrp.kod
GROUP BY DB_maskod ORDER BY dbkart.db_altkod,DB_ADI,DB_TIP 
mantıken düşünecek olursanız, bir alana göre grupladığınızda diğer alanı da seçmek istediğinizde eğer farklı iki değer varsa hangisini getirmesini bekliyorsunuz?

Yani şöyle düşünün:

alan1 alan2
1 a
1 b

alan1 e göre grupladınız ve 1 değerleri gruplanarak tek satır olarak dönüyor, e bana gruplamadığım alan2 yi de ver derseniz hangi değer getirecek? a yı mı b yi mi?

Umarım anlatabilmişimdir..
Çok Çok Çok Teşekkürler!..
Saatlerdir uğraştığım MySql sorgusundaki sum problemini burdaki örnekle çözdüm...
Cevapla