Skip to main content

AccessTr.neT


Sorgu İçin Yardım Lütfen

Sorgu İçin Yardım Lütfen

Çözüldü #1
ekte sorguya ek yapılacak ama Sql kodları bilemediğimden yardımlarınızı rica ediyorum. ATOYKAN üstadım bu sorguyu benim için yapmıştı. Ellerine sağlık. Ancak bazı kriterler daha gerekli. Onu yapamıyorum lütfen yardımcı olur musunuz?

Bu sorgu mantığı şöyle olacak;
05_HabasGelir Tablosundaki ToplamFaturaTutarı, (bu tabloda başka alt gelir yok)
06_AkaryakitSarf Tablosundaki ToplamAkaryakıtTutarı (bu tabloda başka alt gider yok)
07_HgsKayit Tablosundaki ToplamHgsTutarı (bu tabloda başka alt gider yok)
08_AracGiderKayit Tablosundaki ToplamGiderTutarı (bu tabloda alt gider VAR)

05,06,07 tutarlarını alırken sorun yok 08 giderinin toplamı değil alt giderleriyle ayrıntılı toplam gerekiyor.. 
Sorguya bağlı rapor oluşturulduğunda;
Habas Gelir : .................... TL
Akaryakit    :......................TL
Hgs            :......................TL
Gider Adblue :....................TL
Gider Yemek :.....................TL
Gider Trafik Ceza :..............TL vb...  gibi olmasını istiyorum. Yani aslında takıldığım yer 08_AracGiderKayit alt gider türlerinin toplamını alamamak. 

Ve bunlar iki tarih aralığına göre yapmak istiyorum. Bilgisi ilgisi olan üdtadlardan yardım rica ediyorum.
Cevapla
#2
Talebiniz ilk sorunuza göre biraz daha karmaşık, ilk talep doğrultusunda 4 tablodaki sorgudan 3 tanesi aynı tablo içinden tek bir verinin toplamlarını listelemek kolay. Ancak 4. tablo gider tablosunda her bir gider türü için ayrı gruplama yapılacağından bu sorgu birleştirmeye dahil edilirse örneğin adblue için toplam diğer sütunlarda fatura hgs s toplamları sonra yemek gideri toplamı bir satırda yine yanında diğer sütunlarda fatura hgs vs toplamları tekrarlanan ve tam olarak yapmak istediğinizi elde edemeyeceğiniz bir sorgu oluşur. Özetle ifade edecek lursak bu tip bir sorgunun sonucunu
Plaka            GiderTuru    ToplaGiderTutar ToplaFaturaTutarı ToplaAlinanLitre ToplaAlinanTl ToplaIslemTutarı
35BTC943  Adblue      3801 3084706,63 16862 788078,81 143907
35BTC943  Diğer      3135 3084706,63 16862 788078,81 143907
35BTC943  Tamir&İşçilik      1300 3084706,63 16862 788078,81 143907
35BTC943  Yemek      4593,76 3084706,63 16862 788078,81 143907
gibi karmaşık bir şekilde görürsünüz. Bunu önlemek ve istediğiniz gibi sütunlar bazında listeleyebilmek için Gider tablosunda her bir gider türüne göre toplamları alan ve bunu tranform ederek sütun haline getiren crosstab sorgusunu oluşturmak ve kaydetmek ve birleşik sorguda gider tablosu yerine bu sorguyu kullanmak gerekir. bunun için bir crosstab sorusu oluşturduğumuzda
TRANSFORM Sum([08_AracGiderKayit].Tutar) AS ToplamTutar
SELECT [01_TumAraclar].Plaka
FROM [01_TumAraclar]
INNER JOIN [08_AracGiderKayit] ON [01_TumAraclar].Plaka = [08_AracGiderKayit].PlakaNo
WHERE [08_AracGiderKayit].Tarih > #1/1/2025# AND [08_AracGiderKayit].Tarih < #3/31/2025#
GROUP BY [01_TumAraclar].Plaka
PIVOT [08_AracGiderKayit].GiderTuru IN ('Adblue', 'Diğer', 'Akaryakıt', 'Yemek', 'Tamir&İşçilik');
şeklinde olacaktır ve bunu örneğin GiderPivot adı ile kaydelim. Bu noktadan sonra ilk talebinizdeki 08_Gider tablosu yerine bu sorguyu kullanarak istediğimiz toplaları sizin istediğiniz şekilde listeleyebiliriz. Bu durumda da yeni sorgumuz
SELECT 
    G.Plaka,
    Nz(G.[Diğer], 0) AS ToplaDigerTutarı,
    Nz(G.[Adblue], 0) AS ToplaAdblueTutarı,
    Nz(G.[Akaryakıt], 0) AS ToplaAkarkayıtTutarı,
    Nz(G.[Tamir&İşçilik], 0) AS ToplaTamiratTutarı,
    Nz(G.[Yemek], 0) AS ToplaYemekTutarı,
    Nz(F.ToplaFaturaTutarı, 0) AS ToplaFaturaTutarı,
    Nz(AK.ToplaAlinanTl, 0) AS ToplaAlinanTl,
    Nz(H.ToplaIslemTutarı, 0) AS ToplaIslemTutarı

FROM
    (((GiderPivot AS G
            LEFT JOIN (
                SELECT Plaka, Sum(FaturaTutarı) AS ToplaFaturaTutarı
                FROM [05_HabasGelir]
                WHERE Tarih > #1/1/2025# AND Tarih < #3/31/2025#
                GROUP BY Plaka) AS F ON G.Plaka = F.Plaka)
            LEFT JOIN (
                SELECT PlakaNo, Sum(AlinanTl) AS ToplaAlinanTl
                FROM [06_AkaryakitSarf]
                WHERE Tarih > #1/1/2025# AND Tarih < #3/31/2025#
                GROUP BY PlakaNo) AS AK ON G.Plaka = AK.PlakaNo)
            LEFT JOIN (
                SELECT Plaka, Sum(IslemTutarı) AS ToplaIslemTutarı
                FROM [07_HgsKayit]
                WHERE GirisTarihi > #1/1/2025# AND GirisTarihi < #3/31/2025#
                GROUP BY Plaka) AS H ON G.Plaka = H.Plaka);
şeklinde olmalıdır.
Cevapla
#3
(24/07/2025, 03:36)atoykan yazdı: Talebiniz ilk sorunuza göre biraz daha karmaşık, ilk talep doğrultusunda 4 tablodaki sorgudan 3 tanesi aynı tablo içinden tek bir verinin toplamlarını listelemek kolay. Ancak 4. tablo gider tablosunda her bir gider türü için ayrı gruplama yapılacağından bu sorgu birleştirmeye dahil edilirse örneğin adblue için toplam diğer sütunlarda fatura hgs s toplamları sonra yemek gideri toplamı bir satırda yine yanında diğer sütunlarda fatura hgs vs toplamları tekrarlanan ve tam olarak yapmak istediğinizi elde edemeyeceğiniz bir sorgu oluşur. Özetle ifade edecek lursak bu tip bir sorgunun sonucunu
Plaka            GiderTuru    ToplaGiderTutar ToplaFaturaTutarı ToplaAlinanLitre ToplaAlinanTl ToplaIslemTutarı
35BTC943  Adblue      3801 3084706,63 16862 788078,81 143907
35BTC943  Diğer      3135 3084706,63 16862 788078,81 143907
35BTC943  Tamir&İşçilik      1300 3084706,63 16862 788078,81 143907
35BTC943  Yemek      4593,76 3084706,63 16862 788078,81 143907
gibi karmaşık bir şekilde görürsünüz. Bunu önlemek ve istediğiniz gibi sütunlar bazında listeleyebilmek için Gider tablosunda her bir gider türüne göre toplamları alan ve bunu tranform ederek sütun haline getiren crosstab sorgusunu oluşturmak ve kaydetmek ve birleşik sorguda gider tablosu yerine bu sorguyu kullanmak gerekir. bunun için bir crosstab sorusu oluşturduğumuzda
TRANSFORM Sum([08_AracGiderKayit].Tutar) AS ToplamTutar
SELECT [01_TumAraclar].Plaka
FROM [01_TumAraclar]
INNER JOIN [08_AracGiderKayit] ON [01_TumAraclar].Plaka = [08_AracGiderKayit].PlakaNo
WHERE [08_AracGiderKayit].Tarih > #1/1/2025# AND [08_AracGiderKayit].Tarih < #3/31/2025#
GROUP BY [01_TumAraclar].Plaka
PIVOT [08_AracGiderKayit].GiderTuru IN ('Adblue', 'Diğer', 'Akaryakıt', 'Yemek', 'Tamir&İşçilik');
şeklinde olacaktır ve bunu örneğin GiderPivot adı ile kaydelim. Bu noktadan sonra ilk talebinizdeki 08_Gider tablosu yerine bu sorguyu kullanarak istediğimiz toplaları sizin istediğiniz şekilde listeleyebiliriz. Bu durumda da yeni sorgumuz
SELECT 
    G.Plaka,
    Nz(G.[Diğer], 0) AS ToplaDigerTutarı,
    Nz(G.[Adblue], 0) AS ToplaAdblueTutarı,
    Nz(G.[Akaryakıt], 0) AS ToplaAkarkayıtTutarı,
    Nz(G.[Tamir&İşçilik], 0) AS ToplaTamiratTutarı,
    Nz(G.[Yemek], 0) AS ToplaYemekTutarı,
    Nz(F.ToplaFaturaTutarı, 0) AS ToplaFaturaTutarı,
    Nz(AK.ToplaAlinanTl, 0) AS ToplaAlinanTl,
    Nz(H.ToplaIslemTutarı, 0) AS ToplaIslemTutarı

FROM
    (((GiderPivot AS G
            LEFT JOIN (
                SELECT Plaka, Sum(FaturaTutarı) AS ToplaFaturaTutarı
                FROM [05_HabasGelir]
                WHERE Tarih > #1/1/2025# AND Tarih < #3/31/2025#
                GROUP BY Plaka) AS F ON G.Plaka = F.Plaka)
            LEFT JOIN (
                SELECT PlakaNo, Sum(AlinanTl) AS ToplaAlinanTl
                FROM [06_AkaryakitSarf]
                WHERE Tarih > #1/1/2025# AND Tarih < #3/31/2025#
                GROUP BY PlakaNo) AS AK ON G.Plaka = AK.PlakaNo)
            LEFT JOIN (
                SELECT Plaka, Sum(IslemTutarı) AS ToplaIslemTutarı
                FROM [07_HgsKayit]
                WHERE GirisTarihi > #1/1/2025# AND GirisTarihi < #3/31/2025#
                GROUP BY Plaka) AS H ON G.Plaka = H.Plaka);
şeklinde olmalıdır.
hocam olayı çözdüm ben, haklısınız çok karışık. ama bahsedilen sorunu çözdüm. hatta buraya yükleyeyim ki diğer arkadaşlarla da paylaşalım. belki ihtiyacı olan üzerinde değiştirme yapmak isteyenler içinde yardımı olur. ben profesyonel değilim. geliştirmek isteyenler olacaktır. sizlere çok çok teşekkür ederim. konuyu çözdüm sorun kalmadı. sizlere minnettarım.
.zip Yeni WinRAR ZIP arşivi.zip (Dosya Boyutu: 2,57 MB | İndirme Sayısı: 2)
Cevapla

Bir hesap oluşturun veya yorum yapmak için giriş yapın

Yorum yapmak için üye olmanız gerekiyor

ya da