SQL Yürüyen Bakiye Running Sum

SQL Yürüyen Bakiye Running Sum

Merhaba Arkadaşlar, şöyle bir tablom var,
KoduTarihKasa AçıklamasıBorçAlacakBakiye
120.0019618.03.2015GELEN HAVALE 0,003.000,003.000,00
120.0030709.12.2014DEVİR1.500,000,001.500,00
120.0030708.01.2015KARGODA MEYD.GELN.0,001.500,003.000,00
120.0030731.01.2015FATURA88,500,002.911,50
120.0030706.03.2015KAPORA KUVEYT TÜRK K...0,00600,003.511,50
120.0030706.03.2015FATURA15.000,010,00-11.488,51
120.0030710.03.2015GELEN HAVALE0,002.400,00-9.088,51
120.0034909.12.2014DEVİR894,320,00-9.982,83
120.0035009.12.2014DEVİR5.523,600,00-15.506,43
120.0048109.12.2014DEVİR135,000,00-15.641,43
120.0050609.12.2014DEVİR621,000,00-16.262,43
120.0050613.01.2015YKB-VAD.ÇEK GİRİŞİ0,005.000,00-11.262,43
120.0050613.01.2015YKB-VAD.ÇEK GİRİŞİ0,005.000,00-6.262,43
120.0050614.01.2015TAHSİLAT0,00500,00-5.762,43
Kodunu filitrelediğim zaman yani bir firmayı seçtiğimde,
KoduTarihKasa AçıklamasıBorçAlacakBakiye
120.0030709.12.2014DEVİR1.500,000,001.500,00
120.0030708.01.2015KARGODA MEYD.GELN.0,001.500,003.000,00
120.0030731.01.2015FATURA88,500,002.911,50
120.0030706.03.2015KAPORA KUVEYT TÜRK K...0,00600,003.511,50
120.0030706.03.2015FATURA15.000,010,00-11.488,51
120.0030710.03.2015GELEN HAVALE0,002.400,00-9.088,51
bakiye kısmını genel olarak gösteriyor. Ben bir firmayı seçtiğimde sadece o firmaya ait bakiye kısmını görmek istiyorum.
Sorgum şu şekilde acaba nerede yanlış yaptım. Şimdiden yardımlarınız için teşekkürler. Saygılarımla,
 WITH CTE AS(SELECT     [#msg_S_0200] AS Kodu, msg_S_0089 AS Tarih, [#msg_S_0093] AS [Belge No], msg_S_0094, msg_S_0003 AS Türü, msg_S_0115 AS [Cari/Hizmet Adı], [#msg_S_0085] AS [Kasa Açıklaması], 
                      msg_S_0113 AS [Karşı Car.Hes.Adı], [msg_S_0101\T] AS Borç, [msg_S_0102\T] AS Alacak, msg_S_0090, msg_S_0091
FROM         dbo.fn_CariFoy(N'0', 0, N'', NULL, '20121231', '20140101', '20201231', 0, N'') AS fn_CariFoy_1
GROUP BY [#msg_S_0200], msg_S_0089, [#msg_S_0093], msg_S_0003, msg_S_0115, [#msg_S_0085], msg_S_0113, [msg_S_0101\T], [msg_S_0102\T], msg_S_0094, msg_S_0090, 
                      msg_S_0091/* msg_S_0091*/ ), CTE2 AS
    (SELECT     Tarih, Kodu, [Belge No], msg_S_0094, Türü, [Cari/Hizmet Adı], [Kasa Açıklaması], [Karşı Car.Hes.Adı], Borç, Alacak, RN = ROW_NUMBER() OVER (ORDER BY Kodu, Tarih, msg_S_0094, 
                             msg_S_0090, msg_S_0091)
FROM         CTE)
    SELECT     Kodu, Tarih, [Kasa Açıklaması], Borç, Alacak, Bakiye =
                                (SELECT     SUM(ISNULL(Alacak, 0)) - SUM(ISNULL(Borç, 0))
                                  FROM          CTE2
                                  WHERE      RN <= t .RN)
     FROM         CTE2 t
Farklı şekillerde sorgu yazılabilir. Eğer gün bazından gruplanmış olsaydı her kaydı kronolojik olarak kendisinden önceki kayıtla join edip toplayabilirsin. Fakat burada gün bazında gruplama olmadığı için sub query kullanmak zorunda kalabilirsin ki bu da performans sorunu olabilir. En mantıklı CTE yapısını kullanmaktır.
Aşağıdaki 2 farklı çözüm yazılmıştır.
WITH cteHesap AS(
    SELECT ROW_NUMBER() OVER (ORDER BY TARIH) as TarihId, TARIH,ISNULL(SUM(BORC-ALACAK),0) BAKIYE
    FROM Denem GROUP BY TARIH
)

SELECT c1.TARIH,c1.BAKIYE [Gün Sonu Bakiye],SUM(c2.BAKIYE) [Kumulatif Bakiye]
FROM cteHesap c1 LEFT JOIN cteHesap c2 ON c1.TarihId>=c2.TarihId
WHERE c1.TARIH<='20120606'
GROUP BY c1.TARIH,c1.BAKIYE
ORDER BY 1
2.yöntem eskiden kalma iç-içe sorgu oluşturmadır.
SELECT t1.TARIH,SUM(t1.BORC-t1.ALACAK)[Gün Sonu Bakiye],
(SELECT SUM(BORC-ALACAK) FROM Denem WHERE TARIH<=t1.TARIH) [Kumulatif Bakiye]
FROM Denem t1 WHERE TARIH<='20120606'
GROUP BY TARIH 
ilk yöntem kendimiz o anda bir satır numarası veriyoruz.

Hiç yorum yok:

Yorum Gönder