Viewları Birleştirmek(Çözüldü)

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
Kullanıcı avatarı
armadillo
Üye
Mesajlar: 67
Kayıt: 07 Tem 2005 01:16
Konum: Antalya

Viewları Birleştirmek(Çözüldü)

Mesaj gönderen armadillo »

Selamlar Arkadaşlar
Benim projemde yaklaşık 4 kadar view var bu viewlarda

Tarih *************************** Maliyeti

şeklinde alanlarım var ( daha bir çok alan içeriyor ama lazım olanlar bunlar.
burada yapmak istediğim bu 4 view ı birleştirip yeni bir view oluşturmak. Günlükmaliyet adında

sıkıntım ise

Kod: Tümünü seç

view1

Tarih       maliyeti
01.02.2006     100 
**********     ***
**********     ***

view2
tarih        maliyeti
31.01.2006     120 
01.02.2006     150
**********     ***
**********     ***

oluşturduğum yeni viewde istediğim sonuç ise
tarih       view1_maliyet       view2_maliyet
31.01.2006         0                120 
01.02.2006        100               150
**********       *****              ****
gibi ama yeni oluşturduğum viewda tarih alanını nasıl birleştireceğim.
referans olarak view1 i alırsam 31.01.2006 kayıtlı tarih günlük_maliyet viewda görünmüyor. tersini yapsam devam eden datalarda tarih alanı uyuşmazlığı yani gene mevcut olma ihtimali var yani viewlarda tarih alanların eş olmama durumu var (view1 ile view2 arasındaki fark gibi)

Nasıl bir sql komutu yazmalıyım ki. istisnasız bu dört viewdeki alanları (tarih, maliyet) view gunluk_maliyette görebileyim.

Şimdiden teşekkürler.
En son armadillo tarafından 01 Şub 2007 09:33 tarihinde düzenlendi, toplamda 3 kere düzenlendi.
Arama Özelliklerinden Maksimum Yararlanın Sorularınıza Hızlı Cevap Bulun

Ben Acemi Birisiyim Hatalarım İçin Hoş Görünüze Sığınıyorum. Teşekkürler
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

FireBird 2.0 veritabanında şuna benzer bir kod işinizi görecektir:

Kod: Tümünü seç

SELECT
  T1.TARIH,
  COALESCE(T2.MALIYET, 0) AS MALIYET_1,
  COALESCE(T3.MALIYET, 0) AS MALIYET_2
FROM (
      SELECT DISTINCT TARIH FROM VIEW_1
      UNION
      SELECT DISTINCT TARIH FROM VIEW_2
     ) T1
  LEFT JOIN VIEW_1 T2 ON T2.TARIH = T1.TARIH
  LEFT JOIN VIEW_2 T3 ON T3.TARIH = T1.TARIH
ORDER BY T1.TARIH
Ayrıca FireBird 2.0'da view kullanmanıza da fazla gerek kalmıyor. Derived Tables konusunu incelerseniz gerekli bilgiye ulaşabilirsiniz.

İyi çalışmalar.
Kullanıcı avatarı
armadillo
Üye
Mesajlar: 67
Kayıt: 07 Tem 2005 01:16
Konum: Antalya

Mesaj gönderen armadillo »

Teşekkür ederim.
Aşağıdaki Şekilde Sorunumu Çözdüm

Kod: Tümünü seç

SELECT 
  T1.TARIH, 
  COALESCE(t2.maliyeti, 0) AS "Elektrik Maliyeti",
  COALESCE(T3.kuyu_maliyeti, 0) AS "Kuyu Suyu Maliyeti",
  COALESCE(T3.sebeke_maliyeti, 0) AS "Sebeke Suyu Maliyeti",
  COALESCE(T4.maliyeti, 0) AS "Fueloil Maliyeti",
  COALESCE(T5.maliyeti, 0) AS "LPG Maliyeti",
  COALESCE(T6.maliyeti, 0) AS "Tuz Maliyeti"
FROM ( 
      SELECT DISTINCT TARIH FROM elektrik_tuketim
      UNION 
      SELECT DISTINCT TARIH FROM fueloil_tuketim
      UNION 
      SELECT DISTINCT TARIH FROM lpg_tuketim
      UNION 
      SELECT DISTINCT TARIH FROM su_tuketim
      UNION 
      SELECT DISTINCT TARIH FROM tuz_tuketim
     ) T1 
  LEFT JOIN elektrik_tuketim T2 ON T2.TARIH = T1.TARIH
  LEFT JOIN su_tuketim T3 ON T3.TARIH = T1.TARIH
  LEFT JOIN fueloil_tuketim T4  ON T4.TARIH = T1.TARIH
  LEFT JOIN lpg_tuketim T5 ON T5.TARIH = T1.TARIH
  LEFT JOIN tuz_tuketim T6 ON T6.TARIH = T1.TARIH
  ORDER BY T1.TARIH
Fakat kodları bir türlü SP haline getiremedim. Suspend kısmı ile ilgili bir hata alıyorum. sürekli

Kod: Tümünü seç

SET TERM ^ ;

CREATE PROCEDURE SP_GUNLUK_MALIYET (
    baslangic_tarihi date,
    bitis_tarihi date)
as
begin
  SELECT
  T1.TARIH, 
  COALESCE(t2.maliyeti, 0) AS "Elektrik Maliyeti",
  COALESCE(T3.kuyu_maliyeti, 0) AS "Kuyu Suyu Maliyeti",
  COALESCE(T3.sebeke_maliyeti, 0) AS "Sebeke Suyu Maliyeti",
  COALESCE(T4.maliyeti, 0) AS "Fueloil Maliyeti",
  COALESCE(T5.maliyeti, 0) AS "LPG Maliyeti",
  COALESCE(T6.maliyeti, 0) AS "Tuz Maliyeti"
FROM ( 
      SELECT DISTINCT TARIH FROM elektrik_tuketim
      UNION 
      SELECT DISTINCT TARIH FROM fueloil_tuketim
      UNION 
      SELECT DISTINCT TARIH FROM lpg_tuketim
      UNION 
      SELECT DISTINCT TARIH FROM su_tuketim
      UNION 
      SELECT DISTINCT TARIH FROM tuz_tuketim
     ) T1 
  LEFT JOIN elektrik_tuketim T2 ON T2.TARIH = T1.TARIH
  LEFT JOIN su_tuketim T3 ON T3.TARIH = T1.TARIH
  LEFT JOIN fueloil_tuketim T4  ON T4.TARIH = T1.TARIH
  LEFT JOIN lpg_tuketim T5 ON T5.TARIH = T1.TARIH
  LEFT JOIN tuz_tuketim T6 ON T6.TARIH = T1.TARIH
  where t1.tarih between baslangic_tarihi and bitis_tarihi
ORDER BY T1.TARIH
  suspend;
end^

SET TERM ; ^
Hata Mesajı

Kod: Tümünü seç

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 32, column 3.
suspend.
Nerede Hata yaptığımı bulamadım bir türlü Yardımlarınız için şimdiden teşekkür ederim.
Arama Özelliklerinden Maksimum Yararlanın Sorularınıza Hızlı Cevap Bulun

Ben Acemi Birisiyim Hatalarım İçin Hoş Görünüze Sığınıyorum. Teşekkürler
Kullanıcı avatarı
armadillo
Üye
Mesajlar: 67
Kayıt: 07 Tem 2005 01:16
Konum: Antalya

Mesaj gönderen armadillo »

Kod: Tümünü seç

CREATE VIEW RP_GUNLUK_TUKETIM(
    TARIH,
    "Elektrik Maliyeti",
    "Kuyu Suyu Maliyeti",
    "Sebeke Suyu Maliyeti",
    "Fueloil Maliyeti",
    "LPG Maliyeti",
    "Tuz Maliyeti")
AS
SELECT 
  T1.TARIH, 
  COALESCE(t2.maliyeti, 0) ,
  COALESCE(T3.kuyu_maliyeti, 0),
  COALESCE(T3.sebeke_maliyeti, 0),
  COALESCE(T4.maliyeti, 0),
  COALESCE(T5.maliyeti, 0),
  COALESCE(T6.maliyeti, 0)
FROM ( 
      SELECT DISTINCT TARIH FROM elektrik_tuketim
      UNION 
      SELECT DISTINCT TARIH FROM fueloil_tuketim
      UNION 
      SELECT DISTINCT TARIH FROM lpg_tuketim
      UNION 
      SELECT DISTINCT TARIH FROM su_tuketim
      UNION 
      SELECT DISTINCT TARIH FROM tuz_tuketim
     ) T1 
  LEFT JOIN elektrik_tuketim T2 ON T2.TARIH = T1.TARIH
  LEFT JOIN su_tuketim T3 ON T3.TARIH = T1.TARIH
  LEFT JOIN fueloil_tuketim T4  ON T4.TARIH = T1.TARIH
  LEFT JOIN lpg_tuketim T5 ON T5.TARIH = T1.TARIH
  LEFT JOIN tuz_tuketim T6 ON T6.TARIH = T1.TARIH

ORDER BY T1.TARIH
;
Şeklinde Bir view oluşturarak istediğim sonuca ulaştım fakat Ben bu sorguyu SP içerisinde kullanmak istiyorum. Yardımlarınız için şimdiden teşekkürler
Arama Özelliklerinden Maksimum Yararlanın Sorularınıza Hızlı Cevap Bulun

Ben Acemi Birisiyim Hatalarım İçin Hoş Görünüze Sığınıyorum. Teşekkürler
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Şuna benzer bir SP yazabilirsin:

Kod: Tümünü seç

CREATE OR ALTER PROCEDURE P_RP_GUNLUK_TUKETIM (aBASLANGIC_TARIHI DATE, aBITIS_TARIHI DATE)
  RETURNS (
    TARIH                DATE,
    Elektrik_Maliyeti    DOUBLE PRECISION,
    Kuyu_Suyu_Maliyeti   DOUBLE PRECISION,
    Sebeke_Suyu_Maliyeti DOUBLE PRECISION,
    Fueloil_Maliyeti     DOUBLE PRECISION,
    LPG_Maliyeti         DOUBLE PRECISION,
    Tuz_Maliyeti         DOUBLE PRECISION
)
AS
BEGIN
  FOR SELECT
    "TARIH",
    "Elektrik Maliyeti",
    "Kuyu Suyu Maliyeti",
    "Sebeke Suyu Maliyeti",
    "Fueloil Maliyeti",
    "LPG Maliyeti",
    "Tuz Maliyeti"
  FROM RP_GUNLUK_TUKETIM
  WHERE TARIH BETWEEN :aBASLANGIC_TARIHI AND :aBITIS_TARIHI
  INTO
    :TARIH,
    :Elektrik_Maliyeti,
    :Kuyu_Suyu_Maliyeti,
    :Sebeke_Suyu_Maliyeti,
    :Fueloil_Maliyeti,
    :LPG_Maliyeti,
    :Tuz_Maliyeti
  DO SUSPEND;
END
Ancak direk SQL kullanmayı öğrenmen bilhassa farklı veritabanlarında çalışma durumunda çok büyük avantaj. Zira ANSI-SQL standardı kullanılan SQL hemen her veritabanında kullanılabiliyor. Ancak SP'lerin her veritabanı için farklı yazılması gerekiyor.

İyi çalışmalar.
Kullanıcı avatarı
armadillo
Üye
Mesajlar: 67
Kayıt: 07 Tem 2005 01:16
Konum: Antalya

Mesaj gönderen armadillo »

:oops: Teşekkür ederim. Ben SP yi yazmışım ama sonuçlar nereye gidecek değilmi :oops: :oops:
Arama Özelliklerinden Maksimum Yararlanın Sorularınıza Hızlı Cevap Bulun

Ben Acemi Birisiyim Hatalarım İçin Hoş Görünüze Sığınıyorum. Teşekkürler
Cevapla