SQL sorgusu (Distinct)

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
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

SQL sorgusu (Distinct)

Mesaj gönderen Uğur1982 »

Merhaba arkadaşlar;

Bu soruya anlamlı bir isim veremedim.Kusura bakmayın gari. :)

Mustahsil Tablosundaki veriler: :arrow:

Kod: Tümünü seç

Cari    Adi     StokAdi   Fiyat   Miktar          Tutar
1       ugur     elma      50        2             100 
1       ugur     elma      50        4             200
1       ugur     elma      50        6             300
2       ahmet   elma      50        1             50
3       irem     yem       10        5              50
3       irem     yem       10       10            100
Çıkmasını istediğim şöyle bir liste :arrow:

Kod: Tümünü seç

Cari    Adi       StokAdi   Fiyat   Miktar       Tutar
1       ugur     elma       50        12            600 
2       ahmet   elma        50        1              50
3       irem     yem        10        15            150
                  elma      50        13            650  //bir ürüne ait toplamlar
                  yem      10         15            15  
Asıl sorunumda yukarıdaki gibi listeye son iki satırıda eklemek.SQL de bunu yapabilirmiyim. :?: Yada boşuna mı kürek çekiyorum. :D

teşekkür ederim...
onaydin

Mesaj gönderen onaydin »

union kullanmayı denedin mi?
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Şöyle bir Query deneyin:

Kod: Tümünü seç

SELECT
  Cari,
  Adi,
  StokAdi,
  Fiyat,
  SUM(Miktar) AS Miktar,
  SUM(Fiyat * Miktar) AS Tutar
FROM Mustahsil
GROUP BY Cari, Adi, StokAdi, Fiyat
ORDER BY Cari, Adi, StokAdi, Fiyat
Burada Fiyat biraz ilginç durdu. Normalde Fiyatı dahil etmemek gerekebilir.

İyi çalışmalar.
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

Kod: Tümünü seç

Cari    Adi       StokAdi   Fiyat   Miktar       Tutar
1       ugur     elma       50        12            600 
2       ahmet   elma        50        1              50
3       irem     yem        10        15            150
                  elma      50        13            650  //bir ürüne ait toplamlar
                  yem      10         15            15  
Arkadaşlar teşekkür ederim,sorunumu çözdüm,yalnız yukarıdaki şekilde değil.iki ayrı grid kullanarak,sorguları ayırdım.Bu zaten benim bildiğim kolay yöntemdi. :D
onaydin yazdı:union kullanmayı denedin mi?


Google dan araştırdım ,daha komplex union cümleleri için fakat istediğimi yine elde edemedim.Nasıl bir SQL cümlesi kullanmam gerekir :?:

teşekkür ederim...
onaydin

Mesaj gönderen onaydin »

Kod: Tümünü seç

SELECT
  Cari,
  Adi,
  StokAdi,
  Fiyat,
  SUM(Miktar) AS Miktar,
  SUM(Fiyat * Miktar) AS Tutar
FROM Mustahsil
GROUP BY Cari, Adi, StokAdi, Fiyat
union
select null,'Toplam',
StokAdi,
  Fiyat,
  SUM(Miktar) AS Miktar,
  SUM(Fiyat * Miktar) AS Tutar from mustahsil
GROUP BY  StokAdi, Fiyat
order by 1,2,3
SQL lerini birleştiriyorsun.
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

merhaba;

Data type unknown hatası veriyor.Çoğunluk

Kod: Tümünü seç

null,'Toplam', 
bundan kaynaklanıyor.

+ vt :Firebird 1.5
onaydin

Mesaj gönderen onaydin »

Kendi ilave ettiğin sahte alanları castfonksiyonu ile o alanın tipine çevir birde oyle dene.

Kod: Tümünü seç

cast('Toplam' as varchar(20)) 
gibi
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

Kod: Tümünü seç

  Cari,
  Adi,
  StokAdi,
  Fiyat,
  SUM(Miktar) AS Miktar,
  SUM(Fiyat * Miktar) AS Tutar
FROM Mustahsil
GROUP BY Cari, Adi, StokAdi, Fiyat
union
select cast(''1000000'' as integer),cast(''Toplam'' as varchar(20)),
StokAdi,
  Fiyat,
  SUM(Miktar) AS Miktar,
  SUM(Fiyat * Miktar) AS Tutar from mustahsil
GROUP BY  StokAdi, Fiyat
order by 1,2,3
@onaydin teşekkür ederim,eline sağlık,çalıştı. :wink:
Cari alanı integer bir alan olduğu için cast(''1000000'' as integer) gibi bir kod işi çözdü.

iyi günler...
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

merhaba arkadaşlar;

Bir nevi devamı niteliğinde olduğu için buraya yazıyorum.
Hareket Tablosundaki veriler: :arrow:

Kod: Tümünü seç

Kod   Adi     Arac_No  Alacak 
1     ugur     1         100       
1     ugur     1         200      
2     ahmet    1         200      
3     murat    1         100     
4     irem     2         200     
5     hayro    2         100     
Asıl istediğim sonuçta şöyle bir şey :arrow:

Kod: Tümünü seç

Kod   Adi     Arac_No  Alacak 
1     ugur     1         300       
2     ahmet    1         200      
3     murat    1         100     
--    Toplam   1         600      
4     irem     2         200     
5     hayro    2         100
--    Toplam    2        300         
** Bu liste Kaç tane araç varsa devam edecek,100 tane araçta olabilir..

Bunu SQL ile nasıl yapabiliriz. :?: değişik bir şey :)

teşekkür ederim.
onaydin

Mesaj gönderen onaydin »

Kod: Tümünü seç

select kod, adi, arac_no, sum(alacak) from hareket    group by kod, adi, arac_no
union
select null, 'Toplam', arac_no, sum(alacak) from hareket group by arac_no
order by 3, 1
cast kısımlarını düzenleyip bir dene istersen.
FB 2 çıktığında cast la ugrasmaya gerek kalmayacak :)
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

@Onaydın teşekkür ederim.Kod hiç nazlanmadan çalıştı :D

Kod: Tümünü seç

select kod, adi, arac_no, sum(alacak) from hareket  group by kod, adi, arac_no
union
select CAST('----' AS varchar(15)), CAST(' --Toplam--' AS varchar(20)),
arac_no, sum(alacak) from hareket group by arac_no
order by 3,1 DESC
iyi akşamlar...
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Maşallah Onur Query builder gibisin.... :)

Nazar değmesin.....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

Merhaba arkadaşlar;

Konu bütünlüğü tam sağlansın diye son sorumu kendim cevaplıyorum. :)

Kod: Tümünü seç

Kod   Adi     Arac_No  Alacak
1     ugur     1         300       
2     ahmet    1         200     
3     murat    1         100     
--    Toplam   1         600     
4     irem     2         200     
5     hayro    2         100
--    Toplam    2        300
--   Genel Toplam --    900  


Yukarıdaki sorunun cevabı;

Kod: Tümünü seç

select kod, adi, arac_no, sum(alacak) from hareket  group by kod, adi, arac_no
union
select CAST('----' AS varchar(15)), CAST(' --Toplam--' AS varchar(20)),
arac_no, sum(alacak) from hareket group by arac_no
union
select CAST('----' AS varchar(15)), CAST(' --Genel Toplam--' AS varchar(20)),
CAST('99999' AS integer), sum(alacak) from hareket
order by 3,1  DESC
Arkadaşlar yukarıdaki gibi benzer bir sonucu, projemde kullandığım şekilde yazıyorum,join kullanılarak. İlgilenen arkadaşlara faydası olacağından eminim... 8)

Kod: Tümünü seç

select c.kod, ch.ad, ch.soy,kod1_ID,sum(ch.borc) as ToplamBorc,
 sum(ch.alacak) as ToplamAlacak,

 case when (sum(borc)-sum(alacak))>0 then
                       sum(borc)-sum(alacak) else 0 end,
 case when (sum(borc)-sum(alacak))<0 then
                      sum(alacak)-sum(borc) else 0 end

  from carihareket ch
  inner join CARIKART C on C.CARI_ID=CH.CARI_ID
  and c.kod1_ID in (select kodlar_iz from carikodtanim)
  group by c.kod, ch.ad,ch.soy,kod1_ID
  -----------
   union
  -----------
select CAST('----' AS varchar(15)), CAST('----' AS varchar(20)),
 CAST('--Toplam--' AS varchar(20)),kod1_ID

            ,sum(ch.borc) as ToplamBorc,
             sum(ch.alacak) as ToplamAlacak,
             case when (sum(borc)-sum(alacak))>0 then
                                   sum(borc)-sum(alacak) else 0 end,
             case when (sum(borc)-sum(alacak))<0 then
                                  sum(alacak)-sum(borc) else 0 end

  from carihareket ch
  inner join CARIKART C on C.CARI_ID=CH.CARI_ID
  and c.kod1_ID in (select kodlar_ID from carikodtanim)
  group by carikart.kod1_ID

  -----------
   union
  -----------
select CAST('----' AS varchar(15)), CAST('----' AS varchar(20)),
 CAST('--Genel Toplam--' AS varchar(20)),CAST('999999999' AS integer)

            ,sum(ch.borc) as ToplamBorc,
             sum(ch.alacak) as ToplamAlacak,
             case when (sum(borc)-sum(alacak))>0 then
                                   sum(borc)-sum(alacak) else 0 end,
             case when (sum(borc)-sum(alacak))<0 then
                                  sum(alacak)-sum(borc) else 0 end

from carihareket ch
inner join CARIKART C on C.CARI_ID=CH.CARI_ID
  and c.kod1_ID in (select kodlar_iz from carikodtanim)
 --------------
order by 4,1 desc, 5 desc
Ayrıca Union konusunu anlamamda yardımı olan @Onaydın'a tekrar teşekkür ederim.

herkese sevgiler...
onaydin

Mesaj gönderen onaydin »

Eh bayadır sql sorusu goremiyorduk forumda iyi oldu :). Soruyu sadeleştirerek sormanda iyi olmus.

Ayrıca Union konusunu anlamamda yardımı olan Fahrettin Beye tekrar teşekkür ederim. :oops:
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Estağfirullah Onur sen zaten meseleyi kapmak uzereyken ben durumu farkedip son anda anlatarak ogrenmenden pay aldım.... :D
Uyanıklık anlıyacagın.... ;)
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Cevapla