ay bazında satıs ve ıskonto toplamı ?

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
BOGACHAN
Üye
Mesajlar: 38
Kayıt: 12 May 2004 02:37
Konum: istanbbul

ay bazında satıs ve ıskonto toplamı ?

Mesaj gönderen BOGACHAN »

formdan bi arkadaşın yardımıyla ms sql 'de case yapısını if şeklinde yapabileceğimi öğrendim ve sorguyu bu şekilde düzenlemeye çalıştım.

Kod: Tümünü seç

SELECT   DONEM = 
      CASE MONTH(A.TARIH)
         WHEN 1 THEN 'OCAK'
         WHEN 2 THEN 'ŞUBAT'
         WHEN 3 THEN 'MART'
         WHEN 4 THEN 'NİSAN'
         WHEN 5 THEN 'MAYIS'
         WHEN 6 THEN 'HAZİRAN'
         WHEN 7 THEN 'TEMMUZ'
         WHEN 8 THEN 'AĞUSTOS'
         WHEN 9 THEN 'EYLÜL'
         WHEN 10 THEN 'EKİM'
         WHEN 11 THEN 'KASIM'
         WHEN 12 THEN 'ARALIK' END, SUM(B.MIKTAR)MIKTAR, SUM(B.MIKTAR*B.FIYAT) TUTAR,

         ISKONTOTUTAR = 
       CASE (A.ISKTUR) 
         WHEN 1 THEN SUM((B.MIKTAR*B.FIYAT)*(A.DIBISK*100/A.ARATOP)/100) 
         WHEN 2 THEN SUM((B.MIKTAR*B.FIYAT)*(A.DIBISK)/100)
END
FROM FATURA A, FATURADET
WHERE A.TIP=TS AND A.TIP=B.TIP AND A.SIRKET=B.SIRKET AND A.FISNO=B.FISNO
GROUP BY MONTH(A.TARIH),A.ISKTUR
ORDER BY MONTH(A.TARIH)
GO
ben bu sorgu sonucunun ay bazında dönemesini istiyorum.
dönem Satış_miktarı Satış_tutarı Satış_iskonto
ocak 350 3500 110

şeklinde. fakat group by a.ıskyt gurupladığımda bu sorgu
ocak ... .... ....
ocak ... .... ....
şeklinde dönüyor case içindeki şartlardan dönen değerleri direk toplatma şansım yokmu guruplamadan çalışmıyor. (ısktur 1 ise tutar 2 ise yüzde bazında iskonto yapılmış demek)
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Bu istediğiniz şey için bir stored procedure yazmanız lazım. O procedure içinde bir temp tablo oluşturun ve her ay içinde bir alan açın:

Kod: Tümünü seç

CREATE TABLE #MyTable (Tip int, Ocak float,Subat float,....,Satis_Tutari float)
gibi, (burada siz her tip için bir satır tutmuş olacaksınız yani- burayı tam olarak neye göre tutmak istiyorsanız ona göre değiştirmelisiniz ben sizin sorgunuzu böyle anladığımdan böyle yazdım)

sonra bu tabloya ilk kaydınızı insert yapmanız lazım. Bu her tipi önce diğer alanları boş atayarak yapılacak ibr kayıt olabilir. Artık tip değerlerini nerden alıyorsanız.

Ondan sonra her ay için sorgunuzu hazırlayıp temp tablonuza gerekli şartları vererek ilgili aya update yapmanız lazım.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Query'i şu şekilde dener misiniz?

Kod: Tümünü seç

SELECT
      CASE MONTH(A.TARIH)
         WHEN 1 THEN 'OCAK'
         WHEN 2 THEN 'ŞUBAT'
         WHEN 3 THEN 'MART'
         WHEN 4 THEN 'NİSAN'
         WHEN 5 THEN 'MAYIS'
         WHEN 6 THEN 'HAZİRAN'
         WHEN 7 THEN 'TEMMUZ'
         WHEN 8 THEN 'AĞUSTOS'
         WHEN 9 THEN 'EYLÜL'
         WHEN 10 THEN 'EKİM'
         WHEN 11 THEN 'KASIM'
         WHEN 12 THEN 'ARALIK' END,
         SUM(B.MIKTAR)MIKTAR, SUM(B.MIKTAR*B.FIYAT) TUTAR,
       SUM(CASE A.ISKTUR
                WHEN 1 THEN (B.MIKTAR*B.FIYAT)*(A.DIBISK*100/A.ARATOP)/100
                WHEN 2 THEN (B.MIKTAR*B.FIYAT)*(A.DIBISK)/100)
END
FROM FATURA A, FATURADET
WHERE A.TIP=TS AND A.TIP=B.TIP AND A.SIRKET=B.SIRKET AND A.FISNO=B.FISNO
GROUP BY 1
ORDER BY 1
İyi çalışmalar.
BOGACHAN
Üye
Mesajlar: 38
Kayıt: 12 May 2004 02:37
Konum: istanbbul

Mesaj gönderen BOGACHAN »

Hakan Can yazdı:Query'i şu şekilde dener misiniz?

Kod: Tümünü seç

SELECT

       SUM(CASE A.ISKTUR
                WHEN 1 THEN (B.MIKTAR*B.FIYAT)*(A.DIBISK*100/A.ARATOP)/100
                WHEN 2 THEN (B.MIKTAR*B.FIYAT)*(A.DIBISK)/100)
END
FROM FATURA A, FATURADET
WHERE A.TIP=TS AND A.TIP=B.TIP AND A.SIRKET=B.SIRKET AND A.FISNO=B.FISNO
GROUP BY 1
ORDER BY 1
İyi çalışmalar.
Hakan kardeş söylediğin şekilde denedim yalnız senin sum(case satırında açmış olduğun parantezi nerde kapatacağımı bulamadım end den sorna kappatığımda hata veriyor end önce kapattım gene hata veriyor sum 'ı kaldırıp denedim ozamanda group by da takılıyor.

Naile hnm stored procedur lerle alkalı bilgim formdan procedürlerle alakalı okuduklarım (çoğunluğuna göz atmışımdır) bu işle alkalı procedürü yazacak kadar bilgim yok.

olayı kısaca özetliyeyim. fatura fatura başlık bilgilerinin tutulduğu faturadet detay yani stok tutulduğu tablo. ben bu iki tabloya dayalı rapor yapmak istiyorum. iki tabloyu kullanmamın nedeni faturada dib iskonto yapılmışsa bunu başlıkta tutuyor yapılan kalem yani satırbazındaki iskontalarıda faturadetay da tutuyor. hesaplatmada problemim yok ama bunları ay bazında toplam olarak göstermesi lazım group by month(tarıh) dedimmi buda çözülüyor ama gurubun içine iskontoturı sokamadan sorgu çalışmıyor. sokunca bilgiyi iki satır şeklinde getiriyor.

ilgilendiğiniz için teşekkürler..
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Parantezi END'den sonra kullanacaksın.

Ancak CASE WHEN'i eski şeklinde kullanıyorsun.

Normal SUM ile kullanımı şu şekilde:

Kod: Tümünü seç

SELECT
  URUN_KODU,
  YIL,
  SUM(CASE WHEN AY = 1 THEN TUTAR ELSE 0.0 END) AS OCAK,
  SUM(CASE WHEN AY = 2 THEN TUTAR ELSE 0.0 END) AS SUBAT,
  SUM(CASE WHEN AY = 3 THEN TUTAR ELSE 0.0 END) AS MART,
  .
  .
  .
  SUM(CASE WHEN AY = 12 THEN TUTAR ELSE 0.0 END) AS ARALIK,
  SUM(TUTAR) AS TOPLAM
FROM URUN_TUTARLARI
GROUP BY URUN_KODU, YIL
ORDER BY URUN_KODU, YIL
Bu query'ye benzer mantıkla istediğin query'i yapabilirsin. Basit bir query yazıp dene istersen.

İyi çalışmalar.
Cevapla