﻿<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SQL Server’da Yürüyen Bakiye &#8211; SQL Server Eğitimleri</title>
	<atom:link href="https://sqlserveregitimleri.com/etiket/sql-serverda-yuruyen-bakiye/feed" rel="self" type="application/rss+xml" />
	<link>https://sqlserveregitimleri.com</link>
	<description>SQL Server ile ilgili her şey</description>
	<lastBuildDate>Thu, 03 Feb 2022 06:04:58 +0000</lastBuildDate>
	<language>tr</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.1</generator>
	<item>
		<title>SQL Server’da Yürüyen Bakiye</title>
		<link>https://sqlserveregitimleri.com/sql-serverda-yuruyen-bakiye</link>
		
		<dc:creator><![CDATA[Yavuz Selim Kart]]></dc:creator>
		<pubDate>Fri, 18 Oct 2019 22:59:56 +0000</pubDate>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[sql server yürüyen bakiye]]></category>
		<category><![CDATA[SQL Server’da Yürüyen Bakiye]]></category>
		<category><![CDATA[yürüyen bakiye sql kodu]]></category>
		<guid isPermaLink="false">http://sqlserveregitimleri.com/?p=7853</guid>

					<description><![CDATA[Herkese merhaba, Bu yazıda SQL Server’da yürüyen bakiye hakkında bilgi vereceğim. Aslında bu bilgiyi veren ve kodları hazırlayan kişi Vedat Özer Bey. Sorguyu hazırlamış. Gerekli...]]></description>
										<content:encoded><![CDATA[<p>Herkese merhaba,</p>
<p>Bu yazıda SQL Server’da yürüyen bakiye hakkında bilgi vereceğim.</p>
<p>Aslında bu bilgiyi veren ve kodları hazırlayan kişi <a href="https://www.linkedin.com/in/vedat-%C3%B6zer-aktif-i%C5%9F-aray%C4%B1%C5%9F%C4%B1nda-2529b4115/">Vedat Özer</a> Bey. Sorguyu hazırlamış. Gerekli açıklamaları eklemiş. Bana da paylaşması kaldı.</p>
<p>Kendisine bu çalışması için ayrıca teşekkürler.</p>
<p>İlk olarak yürüyen bakiye nedir kısmına değinelim.</p>
<p>Yürüyen bakiye kısaca müşteriden tahsilat yapıldıktan sonra müşteri bakiyesinin yeniden hesaplanmasıdır.</p>
<p>Aşağıdaki kod bloğunu yeni oluşturduğunuz veritabanı üzerinde deneyebilirsiniz.</p>
<pre class="line-numbers"><code class="language-sql">SET NOCOUNT ON;
IF (OBJECT_ID('tempdb..#SONUC') IS NOT NULL)
BEGIN
    DROP TABLE #SONUC;
END;
CREATE TABLE #SONUC
(
    TARIH DATETIME,
    KOD VARCHAR(15),
    MIKTAR DECIMAL(38, 2),
    DEPOKODU VARCHAR(15),
    ONCEKIBAKIYE DECIMAL(38, 2),
    GUNCELBAKIYE DECIMAL(38, 2)
);
IF (OBJECT_ID('tempdb..#TABLOM') IS NOT NULL)
BEGIN
    DROP TABLE #TABLOM;
END;
CREATE TABLE #TABLOM
(
    TARIH DATETIME,
    KOD VARCHAR(15),
    MIKTAR DECIMAL(38, 2),
    DEPOKODU VARCHAR(15)
);
INSERT INTO #TABLOM
(
    TARIH,
    KOD,
    MIKTAR,
    DEPOKODU
)
SELECT '2019-12-10',
       'A001',
       10,
       '100'
UNION ALL
SELECT '2019-12-10',
       'A001',
       -10,
       '100'
UNION ALL
SELECT '2019-12-10',
       'A001',
       10,
       '102'
UNION ALL
SELECT '2019-12-10',
       'B001',
       10,
       '100'
UNION ALL
SELECT '2019-12-20',
       'B001',
       -20,
       '100';
CREATE CLUSTERED INDEX COZUMPARK ON #TABLOM (KOD, DEPOKODU, TARIH);
DECLARE @GUNCELBAKIYE DECIMAL(38, 2);
SET @GUNCELBAKIYE = 0;
DECLARE @ONCEKIBAKIYE DECIMAL(38, 2);
DECLARE @ALTBAKIYE DECIMAL(38, 2);
SET @ONCEKIBAKIYE = 0;
DECLARE @KOD VARCHAR(15),
        @DEPO VARCHAR(15);
DECLARE STOKKART CURSOR FOR
SELECT KOD,
       DEPOKODU
FROM #TABLOM
GROUP BY KOD,
         DEPOKODU;
OPEN STOKKART;
FETCH NEXT FROM STOKKART
INTO @KOD,
     @DEPO;
WHILE @@FETCH_STATUS = 0
BEGIN
    IF @@ERROR = 0
    BEGIN
        SET @GUNCELBAKIYE = 0;
        SET @ONCEKIBAKIYE = 0;
        DECLARE @TARIH DATETIME,
                @MIKTAR DECIMAL(38, 2);
        DECLARE HAREKET CURSOR FOR
        SELECT TARIH,
               MIKTAR
        FROM #TABLOM
        WHERE KOD = @KOD
              AND DEPOKODU = @DEPO
        ORDER BY TARIH ASC;
        OPEN HAREKET;
        FETCH NEXT FROM HAREKET
        INTO @TARIH,
             @MIKTAR;
        WHILE @@FETCH_STATUS = 0
        BEGIN
            IF @@ERROR = 0
            BEGIN
                SET @GUNCELBAKIYE = @GUNCELBAKIYE + @MIKTAR;
                SET @ONCEKIBAKIYE = @ONCEKIBAKIYE + @GUNCELBAKIYE - @MIKTAR;
                INSERT INTO #SONUC
                (
                    TARIH,
                    KOD,
                    MIKTAR,
                    DEPOKODU,
                    ONCEKIBAKIYE,
                    GUNCELBAKIYE
                )
                VALUES
                (@TARIH, @KOD, @MIKTAR, @DEPO, @ONCEKIBAKIYE, @GUNCELBAKIYE);
            END;
            FETCH NEXT FROM HAREKET
            INTO @TARIH,
                 @MIKTAR;
        END;
        CLOSE HAREKET;
        DEALLOCATE HAREKET;
    END;
    FETCH NEXT FROM STOKKART
    INTO @KOD,
         @DEPO;
END;
CLOSE STOKKART;
DEALLOCATE STOKKART;
SELECT *
FROM #SONUC;</code></pre>
<p>Sorguyu çalıştırdığınızda aşağıdaki gibi bir sonuç alacaksınız.</p>
<p><img fetchpriority="high" decoding="async" class="alignnone wp-image-7855 size-full" src="https://sqlserveregitimleri.com/wp-content/uploads/2019/10/sql-serverda-yuruyen-bakiye-1.jpg" alt="SQL Server’da Yürüyen Bakiye" width="700" height="457" srcset="https://sqlserveregitimleri.com/wp-content/uploads/2019/10/sql-serverda-yuruyen-bakiye-1.jpg 700w, https://sqlserveregitimleri.com/wp-content/uploads/2019/10/sql-serverda-yuruyen-bakiye-1-315x206.jpg 315w, https://sqlserveregitimleri.com/wp-content/uploads/2019/10/sql-serverda-yuruyen-bakiye-1-460x300.jpg 460w, https://sqlserveregitimleri.com/wp-content/uploads/2019/10/sql-serverda-yuruyen-bakiye-1-207x135.jpg 207w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<p>Aşağıda bu işlemin farklı çözümleri de mevcut. Kodları deneyebilirsiniz.</p>
<pre class="line-numbers"><code class="language-sql">SET NOCOUNT ON;
IF (OBJECT_ID('tempdb..#TABLOM') IS NOT NULL)
BEGIN
    DROP TABLE #TABLOM;
END;
CREATE TABLE #TABLOM
(
    SATIRNO INT IDENTITY(1, 1),
    TARIH DATETIME,
    KOD VARCHAR(15),
    MIKTAR DECIMAL(38, 2),
    DEPOKODU VARCHAR(15),
    ONCEKIBAKIYE DECIMAL(38, 2),
    GUNCELBAKIYE DECIMAL(38, 2)
);
CREATE CLUSTERED INDEX SIRALAMA ON #TABLOM (KOD, DEPOKODU, TARIH);
CREATE INDEX STOKKART ON #TABLOM (KOD);
INSERT INTO #TABLOM
(
    TARIH,
    KOD,
    MIKTAR,
    DEPOKODU,
    ONCEKIBAKIYE,
    GUNCELBAKIYE
)
SELECT '2019-12-10',
       'A001',
       10,
       '100',
       0,
       0
UNION ALL
SELECT '2019-12-10',
       'A001',
       -10,
       '100',
       0,
       0
UNION ALL
SELECT '2019-12-10',
       'A001',
       10,
       '102',
       0,
       0
UNION ALL
SELECT '2019-12-10',
       'B001',
       10,
       '100',
       0,
       0
UNION ALL
SELECT '2019-12-20',
       'B001',
       -20,
       '100',
       0,
       0; 


DECLARE @KOD VARCHAR(15);
DECLARE @DEPO VARCHAR(15),
        @GUNCELBAKIYE DECIMAL(38, 2),
        @ONCEKIBAKIYE DECIMAL(38, 2);
SET @KOD = '';
SET @DEPO = '';
SET @GUNCELBAKIYE = 0;
SET @ONCEKIBAKIYE = 0;
UPDATE T
SET @GUNCELBAKIYE=GUNCELBAKIYE = MIKTAR + CASE
                                              WHEN KOD = @KOD
                                                   AND DEPOKODU = @DEPO THEN
                                                  @GUNCELBAKIYE
                                              ELSE
                                                  0
                                          END,
    @ONCEKIBAKIYE=ONCEKIBAKIYE = CASE
                                     WHEN KOD = @KOD
                                          AND DEPOKODU = @DEPO THEN
                                         @GUNCELBAKIYE - MIKTAR
                                     ELSE
                                         0
                                 END,
    @KOD = KOD,
    @DEPO = DEPOKODU
FROM #TABLOM AS T WITH (TABLOCK)
OPTION (MAXDOP 1);
SELECT *
FROM #TABLOM;


SELECT SATIRNO,
       TARIH,
       KOD,
       MIKTAR,
       DEPOKODU,
       BAK.BAKIYE - MIKTAR [ONCEKIBAKIYE],
       BAK.BAKIYE [GUNCELBAKIYE]
FROM #TABLOM AS T
    OUTER APPLY
(
    SELECT SUM(MIKTAR) AS BAKIYE
    FROM #TABLOM AS BAKIYE
    WHERE BAKIYE.KOD = T.KOD
          AND BAKIYE.DEPOKODU = T.DEPOKODU
          AND BAKIYE.TARIH &lt;= T.TARIH
          AND BAKIYE.SATIRNO &lt;= T.SATIRNO
) BAK;



SELECT SATIRNO,
       TARIH,
       KOD,
       MIKTAR,
       DEPOKODU,
       BAKIYE - MIKTAR [ONCEKIBAKIYE],
       BAKIYE [GUNCELBAKIYE]
FROM
(
    SELECT SATIRNO,
           TARIH,
           KOD,
           MIKTAR,
           DEPOKODU,
           (
               SELECT SUM(MIKTAR)
               FROM #TABLOM BAKIYE
               WHERE BAKIYE.KOD = T.KOD
                     AND BAKIYE.DEPOKODU = T.DEPOKODU
                     AND BAKIYE.TARIH &lt;= T.TARIH
                     AND BAKIYE.SATIRNO &lt;= T.SATIRNO
           ) BAKIYE
    FROM #TABLOM AS T
) AS BAK;



SELECT SATIRNO,
       TARIH,
       KOD,
       MIKTAR,
       DEPOKODU,
       BAKIYE - MIKTAR [ONCEKIBAKIYE],
       BAKIYE [GUNCELBAKIYE]
FROM
(
    SELECT SATIRNO,
           TARIH,
           KOD,
           MIKTAR,
           DEPOKODU,
           SUM(MIKTAR) OVER (PARTITION BY KOD,
                                          DEPOKODU
                             ORDER BY TARIH
                             ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
                            ) BAKIYE
    FROM #TABLOM AS T
) AS BAK;</code></pre>
<p>Yukarıdaki kodları çalıştırdığınızda aşağıdaki gibi bir sonuç göreceksiniz.</p>
<p><img decoding="async" class="alignnone wp-image-7856 size-full" src="https://sqlserveregitimleri.com/wp-content/uploads/2019/10/sql-serverda-yuruyen-bakiye-2.jpg" alt="SQL Server’da Yürüyen Bakiye" width="700" height="571" srcset="https://sqlserveregitimleri.com/wp-content/uploads/2019/10/sql-serverda-yuruyen-bakiye-2.jpg 700w, https://sqlserveregitimleri.com/wp-content/uploads/2019/10/sql-serverda-yuruyen-bakiye-2-315x257.jpg 315w, https://sqlserveregitimleri.com/wp-content/uploads/2019/10/sql-serverda-yuruyen-bakiye-2-368x300.jpg 368w, https://sqlserveregitimleri.com/wp-content/uploads/2019/10/sql-serverda-yuruyen-bakiye-2-165x135.jpg 165w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<p>Sorgu ile ilgili detaylı bilgi almak isterseniz <a href="https://www.linkedin.com/in/vedat-%C3%B6zer-aktif-i%C5%9F-aray%C4%B1%C5%9F%C4%B1nda-2529b4115/">Vedat Özer</a> Beye ulaşabilirsiniz.</p>
<p>Herkese çalışma hayatında ve yaşamında başarılar kolaylıklar.</p>
<div class='epvc-post-count'><span class='epvc-eye'></span>  <span class="epvc-count"> 920</span><span class='epvc-label'> Kez Okundu</span></div>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
