Re: [pgsql-tr-genel] kümülatif toplam sorgusu

From: "N(dot) Can KIRIK" <can(at)epati(dot)com(dot)tr>
To: Uygar UZUNHASAN <uygaruzunhasan(at)yahoo(dot)com>
Cc: "pgsql-tr-genel(at)postgresql(dot)org" <pgsql-tr-genel(at)postgresql(dot)org>
Subject: Re: [pgsql-tr-genel] kümülatif toplam sorgusu
Date: 2013-09-09 13:16:55
Message-ID: CAJ1wP5=iYAuAdjkAF8SW42oihGfoNfm8KeW47AUV7mLVFMUW_Q@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-tr-genel

selam,

çeşitli taklalar atarak çözümlenebilir ama şöyle daha kolay bir yöntem var:

madem SUM işimizi görmüyor, o zaman SUM yerine işimizi görecek bir
AGGREGATE hazırlayalım, adı ciciToplam olsun;

önce AGGREGATE'in kendisine gelen her satır toplamı hazırlayacak
fonksiyonunu hazırlayalım: fn_ciciToplam,

CREATE OR REPLACE FUNCTION public."fn_ciciToplam" ( NUMERIC, NUMERIC )
> RETURNS NUMERIC LANGUAGE sql IMMUTABLE STRICT AS $$
> SELECT GREATEST( 0, COALESCE( $1, 0 ) + COALESCE( $2, 0 ) );
> $$;

fonksiyona gelen 2 parametre var, ilki state'i tuyuyor, yani şimdiye kadar
topladığı değerler. ikincisi de her bir satırda gelen değer.

fonksiyonu kullanarak bir AGGREGATE oluşturalım:

> CREATE AGGREGATE "ciciToplam" ( sfunc = "fn_ciciToplam", basetype =
> NUMERIC, stype = NUMERIC );

şimdi de sorgumuzu çalıştıralım:

> WITH
> "tablomuz" AS (
> SELECT
> GENERATE_SERIES( 1, ARRAY_LENGTH( a, 1 ) ) AS "id"
> ,'x'::VARCHAR AS "tip"
> ,UNNEST( a ) AS "miktar"
> FROM
> ( SELECT ARRAY[ 10, 20, -25, -25, 50, -40, 60 ] a ) a
> )
> SELECT
> *
> ,"ciciToplam"( "miktar" ) over "toplam"
> FROM
> "tablomuz" t
> WINDOW
> "toplam" AS ( PARTITION BY "tip" ORDER BY "id" );

kolay gelsin.

*N. Can KIRIK
ePati Bilişim Teknolojileri
http://www.epati.com.tr/*

2013/9/9 Uygar UZUNHASAN <uygaruzunhasan(at)yahoo(dot)com>

> Merhabalar
> Çözemediğim bir sorgu tipi var, altta bir özeneğini göstereyim.
>
> tablomuz:
> id / tip/ miktar
> 1 /x/ 10
> 2 /x/ 20
> 3 /x/ -25
> 4 /x/ -25
> 5 /x/ 50
> 6 /x/ -40
> 7 /x/ 60
>
> buradan alacağım sonuçta toplamlar hiç sıfırın altına düşmemeli ve ona
> göre toplanarak gitmeli (olmasıGereken sütunu), ama yapabildiğim sadece
> sıralı toplam alabilmek şöyleki:
>
> SELECT sum(miktar) over (PARTITION BY tip ORDER BY id) as kalan FROM
> tablomuz;
>
> id /tip/ miktar/kalan/olmasıGereken
> 1 /x/ 10 / 10 / 10
> 2 /x/ 20 / 30 / 30
> 3 /x/ -25 / -5 / -5
> 4 /x/ -25 / -30 / 0
> 5 /x/ 50 / 20 / 50
> 6 /x/ -40 / -20 / 10
> 7 /x/ 60 / 40 / 70
>
> Kısaca durumu şöyle özetleyim, pozitif miktarlar alınan siparişi, negatif
> miktarlar ise teslimatı gösteriyor. Siparişten fazla yapılan teslimatlar,
> eğer normal bir toplam çalıştırılırsak bir sonraki siparişten düşüyor,
> halbuki sipariş verilirken önceden fazla gelmiş mallar göz önünde
> bulundurularak yapılıyor.
>
>
> Uygar UZUNHASAN
>
>

In response to

Responses

Browse pgsql-tr-genel by date

  From Date Subject
Next Message Devrim GÜNDÜZ 2013-09-09 13:17:10 PostgreSQL 9.3.0 duyuruldu.
Previous Message Uygar UZUNHASAN 2013-09-09 11:47:27 kümülatif toplam sorgusu