Query sorgusu dikey bilgiden yatay sonuç ...

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
SieS
Üye
Mesajlar: 166
Kayıt: 17 Haz 2003 10:41
Konum: Konya

Query sorgusu dikey bilgiden yatay sonuç ...

Mesaj gönderen SieS »

Merhaba
Başlık bir garip oldu galiba ama aklıma böyle geldi.

Burda yapmak istediğim aşağıdaki gibi veri girilmiş bir tablom var.

TARIH MAKINA ÜRETİM
------------- --------- ----------
01.02.2004 H1 250
01.02.2004 H2 350
01.02.2004 V1 300
01.02.2004 V2 200
02.02.2004 H1 300
02.02.2004 H2 400
02.02.2004 V1 250

şeklinde uzayıp giden bir tablo var ben buna güre şu şekilde bir rapor alıyorum ama bu işlem için geçici bir tablo oluşturuyorum ona yazdırıp sonuca gidiyorum oysa bu işlem SQL cumlecigi ile yapılabiliyormuş ama nasıl bilen arkadaşlarım vardır mutlaka .

Rapor aşağıdaki gibi
TARİH H1 H2 V1 V2
--------------- ------ ----- ---- ----
01.02.2004 250 350 300 200
02.02.2004 300 400 250 ---

Görüldüğü gibi makina üretimleri günlük giriliyor ve tarih aralığı verilecek
makina üretimleri tek bir satırda gözüküyor.

Herkese şimdiden teşekkür ederim.
Kolay gelsin.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Öncelikle şu sorumuza yanıt verirseniz yöntemi belirleyebiliriz.

Makinalar (H1, H2, V1, V2...) kaç adet ve bunlar sabit mi? Yani sayıları arıtıp azalabiliyor mu ya da eğer değişiklik oluyorsa ne sıklıkta oluyor bu değişimler?

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
SieS
Üye
Mesajlar: 166
Kayıt: 17 Haz 2003 10:41
Konum: Konya

Mesaj gönderen SieS »

Evet Makina adedi sabit .
ASE
Kıdemli Üye
Mesajlar: 518
Kayıt: 28 Ağu 2003 03:17
Konum: samsun
İletişim:

Mesaj gönderen ASE »

benzer bir istatistiğe benimde ihtiyacım olmuştu.
Hüsonet abim burda çözümü yazmıştı sanırım işini görecektir. ancak veri tabanı belitmemişsin. Bu kodlar access için yazıldı, bir çok veri tabanında çalışıyor ama öalışmadığı veri tabanlarıda var.

Kod: Tümünü seç

select YK.ADRES, 
(Select count(*) from YESILKART as YK1 where YK.ADRES=YK1.ADRES and YK1.DURUM='UYGUN') as UYGUN, 
(Select count(*) from YESILKART as YK1 where YK.ADRES=YK1.ADRES and YK1.DURUM='İPTAL') as IPTAL, 
(Select count(*) from YESILKART as YK1 where YK.ADRES=YK1.ADRES and YK1.DURUM='KURULDA') as KURULDA, 
(Select count(*) from YESILKART as YK1 where YK.ADRES=YK1.ADRES and YK1.DURUM='RED') as RED, 
Count(*) as TOPLAM1, UYGUN+IPTAL+KURULDA+RED as TOPLAM2 
from YESILKART as YK 
group by ADRES 
order by ADRES
Allah'ım!...
Yol boyunca bırakma elimi...
Düşerim sonra...


ASE YAZILIM
SieS
Üye
Mesajlar: 166
Kayıt: 17 Haz 2003 10:41
Konum: Konya

Mesaj gönderen SieS »

Üffff
abi bu ne yaw ben bunu anlayana kadar firebird ün 5. sürümü çıkar :oops:
Hemen çalışmaya başlayayım nasıl uyarlarım kendi tabloma
çok teşekkür ederim.
Allah razı olsun .
Selamlar.
ASE
Kıdemli Üye
Mesajlar: 518
Kayıt: 28 Ağu 2003 03:17
Konum: samsun
İletişim:

Mesaj gönderen ASE »

Bu bir istatistik sorgusu ve ben programımda kullandım.
İstersen nasıl çalıştığını görmek için programda inceleyebilirsin.
Senin kodunu aldım deneyeceğim ama firebird bilgim çok fazla değil ben yinede deneyeceğim sonucu burda yazarım.
Kolay gelsin...
Allah'ım!...
Yol boyunca bırakma elimi...
Düşerim sonra...


ASE YAZILIM
SieS
Üye
Mesajlar: 166
Kayıt: 17 Haz 2003 10:41
Konum: Konya

Mesaj gönderen SieS »

Sayın ase yukarda gönderdiğin örneğe dayanarak aşağıdaki kodu yazdım denedim çalıştı ama acayip değerler geldi

İlk select de ki S_no yu içerde kullandığımda hata verdi bende önüne : atınca bu sefe çalışırken parametre olarak S_no istedi

Senin gönderdiğin kodda böyle birşey yok .

Sonuç yanlışta olsa bişeyler yakaladım ilginize teşekkür ederim.

Kod: Tümünü seç

sELECT S_NO,
  (SELECT SUM(DEGER) FROM mdata1 WHERE :S_NO = SIPARIS and KOD = 1) AS URETIM,
  (SELECT SUM(DEGER) FROM mdata1 WHERE :S_NO = SIPARIS and KOD = 2) AS DURUS
FROM
  detay
group BY S_NO
ASE
Kıdemli Üye
Mesajlar: 518
Kayıt: 28 Ağu 2003 03:17
Konum: samsun
İletişim:

Mesaj gönderen ASE »

orda iki farklı alandan sorgulama yaptığı için parametre istedi senden.
Ben şu an interbase kurdum deniyorum doğru sonucu aldığımda yazarım
Kolay gelsin
Allah'ım!...
Yol boyunca bırakma elimi...
Düşerim sonra...


ASE YAZILIM
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

Hiç kullanmadım ama Firebird/interbase kullanoyorsanız wievle bu işi halledebilirsiniz.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Aslinda sayin ASE'nin ilk gonderdigi kod isinize yarar fakat uyarlamada biraz farklilik olmus...

kodu su sekilde yazarsaniz olmasi gerekir... Tablonuzun Adının TABLO oldugunu varsaydım...

Kod: Tümünü seç

Select (Select Sum(T1.URETIM) from TABLO as T1 where T1.TARIH=T.TARIH and T1.MAKINA='H1') as  H1,
Select (Select Sum(T1.URETIM) from TABLO as T1 where T1.TARIH=T.TARIH and T1.MAKINA='H2') as  H2,
Select (Select Sum(T1.URETIM) from TABLO as T1 where T1.TARIH=T.TARIH and T1.MAKINA='V1') as  V1,
Select (Select Sum(T1.URETIM) from TABLO as T1 where T1.TARIH=T.TARIH and T1.MAKINA='V2') as  V2,
from TABLO as T
group by T.TARIH
order by T.TARIH
Bu kod ustunde aptiginiz degisiklikleri ve nerede hata verdigini yazarsanız Allah'in izniyle birlikte hallederiz bu işi...
Kullanıcı avatarı
safak
Şafak EBESEK
Mesajlar: 165
Kayıt: 05 Ağu 2003 04:39
Konum: Istanbul
İletişim:

Mesaj gönderen safak »

İzninizle tasarım konusunu gözden geçirmenizi önereceğim.
Problemin kaynağı burası.

Eğer ilk yazdığınız tablo düzenini kullanıyorsanız, sonuçları da ilk düzenin toplamı olarak raporlamanız uygundur.

Eğer son yazdığınız toplam tablosu (sağa doğru alanlarının sınırlı olduğu güvencesi verilmiş) kullanılacaksa, bilgilerin girildiği tabloyu da bu şekilde hazırlayınız. Yani her makine için bir sütün. Kolayca toplarsınız. Transpoza gerek kalmaz.

Bu tutarlılıkla hazırladığınız tablolarını sorgulanma süresi, denemekte olduğunuz yönteme göre çok daha hızlı olacak. Çünkü tablo üzerinden tek geçişte sonuç üretiliyor. Özellikle büyük tablolarda sonucu açıkca görebilirsiniz.

Kolay Gelsin,
SieS
Üye
Mesajlar: 166
Kayıt: 17 Haz 2003 10:41
Konum: Konya

Mesaj gönderen SieS »

EVVVVETTT işte bu kadar :D
Bütüm emeği geçen arkadaşlar hepinize teşekkür ederim gönderdiğiniz kodlarla deneye deneye sonuca ulaştım doğru kod aşağıda

Kod: Tümünü seç

Select
   (Select Sum(deger) from MDATA1 where MAKINA='1' AND TARIH = '02.01.2001') as  H1,
   (Select Sum(DEGER) from mdata1 where MAKINA='2' AND TARIH = '02.01.2001') as  H2,
   (Select Sum(DEGER) from mdata1 where MAKINA='3' AND TARIH = '02.01.2001') as  H3,
   (Select Sum(DEGER) from mdata1 where MAKINA='4' AND TARIH = '02.01.2001') as  H4
from
    mdata1
 WHERE
  TARIH = '02.01.2001'
GROUP by
  TARIH


HEPİNİZDEN ALLAH RAZI OLSUN EMİNİM ÇOK ARKADAŞIMIZINDA İŞİNE YARAYACAKTIR 
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Kod: Tümünü seç

Select TARIH,
   (Select Sum(deger) from MDATA1 where MAKINA='1' AND TARIH = '02.01.2001') as  H1, 
   (Select Sum(DEGER) from mdata1 where MAKINA='2' AND TARIH = '02.01.2001') as  H2, 
   (Select Sum(DEGER) from mdata1 where MAKINA='3' AND TARIH = '02.01.2001') as  H3, 
   (Select Sum(DEGER) from mdata1 where MAKINA='4' AND TARIH = '02.01.2001') as  H4 
from 
    mdata1 
WHERE 
  TARIH = '02.01.2001' 
GROUP by 
  TARIH
Şeklinde kodu düzeltirseniz gelen Result'ta Tarih alanlarını da görebilirsiniz :)

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
SieS
Üye
Mesajlar: 166
Kayıt: 17 Haz 2003 10:41
Konum: Konya

Mesaj gönderen SieS »

Teşekkürler kuri
üüüüü neler ekledim neler mantığını kaptım ya o bakımdan ... :wink:

Ya bu SQL acayip bişi hakkatten
icat edenden allah razı olsun :lol:
tabiki sizlerdenden sayenizde çok şey öğrendim...
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Ne demek,
Bizler de seviniyoruz,
Bu arada gaza geldim birkaç bişey daha yazayım :P

Kod: Tümünü seç

Select M0.TARIH, 
   (Select Sum(M1.deger) from MDATA1 M1 where M1.MAKINA='1' AND M1.TARIH = M0.TARIH) as  H1, 
   (Select Sum(M1.DEGER) from mdata1 M1 where M1.MAKINA='2' AND M1.TARIH = M0.TARIH) as  H2, 
   (Select Sum(M1.DEGER) from mdata1 M1 where M1.MAKINA='3' AND M1.TARIH = M0.TARIH) as  H3, 
   (Select Sum(M1.DEGER) from mdata1 M1 where M1.MAKINA='4' AND M1.TARIH = M0.TARIH) as  H4 
from 
    mdata1 M0 
WHERE 
  M0.TARIH >= '02.01.2001'  AND M0.TARIH < '01.02.2001'
GROUP by 
  TARIH 
Diye yazarsanız 2 Ocak 2001 ile 1 Şubat 2001 tarihleri arasında gün gün makina toplamlarını alabilirsiniz.


Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Cevapla