SQL Yürüyen Bakiye Running Sum
Merhaba Arkadaşlar, şöyle bir tablom var,
Kodu | Tarih | Kasa Açıklaması | Borç | Alacak | Bakiye |
120.00196 | 18.03.2015 | GELEN HAVALE | 0,00 | 3.000,00 | 3.000,00 |
120.00307 | 09.12.2014 | DEVİR | 1.500,00 | 0,00 | 1.500,00 |
120.00307 | 08.01.2015 | KARGODA MEYD.GELN. | 0,00 | 1.500,00 | 3.000,00 |
120.00307 | 31.01.2015 | FATURA | 88,50 | 0,00 | 2.911,50 |
120.00307 | 06.03.2015 | KAPORA KUVEYT TÜRK K... | 0,00 | 600,00 | 3.511,50 |
120.00307 | 06.03.2015 | FATURA | 15.000,01 | 0,00 | -11.488,51 |
120.00307 | 10.03.2015 | GELEN HAVALE | 0,00 | 2.400,00 | -9.088,51 |
120.00349 | 09.12.2014 | DEVİR | 894,32 | 0,00 | -9.982,83 |
120.00350 | 09.12.2014 | DEVİR | 5.523,60 | 0,00 | -15.506,43 |
120.00481 | 09.12.2014 | DEVİR | 135,00 | 0,00 | -15.641,43 |
120.00506 | 09.12.2014 | DEVİR | 621,00 | 0,00 | -16.262,43 |
120.00506 | 13.01.2015 | YKB-VAD.ÇEK GİRİŞİ | 0,00 | 5.000,00 | -11.262,43 |
120.00506 | 13.01.2015 | YKB-VAD.ÇEK GİRİŞİ | 0,00 | 5.000,00 | -6.262,43 |
120.00506 | 14.01.2015 | TAHSİLAT | 0,00 | 500,00 | -5.762,43 |
Kodunu filitrelediğim zaman yani bir firmayı seçtiğimde,
Kodu | Tarih | Kasa Açıklaması | Borç | Alacak | Bakiye |
120.00307 | 09.12.2014 | DEVİR | 1.500,00 | 0,00 | 1.500,00 |
120.00307 | 08.01.2015 | KARGODA MEYD.GELN. | 0,00 | 1.500,00 | 3.000,00 |
120.00307 | 31.01.2015 | FATURA | 88,50 | 0,00 | 2.911,50 |
120.00307 | 06.03.2015 | KAPORA KUVEYT TÜRK K... | 0,00 | 600,00 | 3.511,50 |
120.00307 | 06.03.2015 | FATURA | 15.000,01 | 0,00 | -11.488,51 |
120.00307 | 10.03.2015 | GELEN HAVALE | 0,00 | 2.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 TARIHilk yöntem kendimiz o anda bir satır numarası veriyoruz.
Hiç yorum yok:
Yorum Gönder