| 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
>
>
| 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 |