From: | Uygar UZUNHASAN <uygaruzunhasan(at)yahoo(dot)com> |
---|---|
To: | "N(dot) Can KIRIK" <can(at)epati(dot)com(dot)tr>, "pgsql-tr-genel(at)postgresql(dot)org" <pgsql-tr-genel(at)postgresql(dot)org> |
Subject: | Yan: [pgsql-tr-genel] Re: [pgsql-tr-genel] kümülatif toplam sorgusu |
Date: | 2013-09-10 05:49:48 |
Message-ID: | 1378792188.33001.YahooMailNeo@web160906.mail.bf1.yahoo.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-tr-genel |
Teşekkürler gerçekten ilaç gibi geldi. Anladım ki function ve aggregate yazımına çalışmalıyım biraz.
Uygar UZUNHASAN
>________________________________
> Kimden: N. Can KIRIK <can(at)epati(dot)com(dot)tr>
>Kime: Uygar UZUNHASAN <uygaruzunhasan(at)yahoo(dot)com>
>Kopya: "pgsql-tr-genel(at)postgresql(dot)org" <pgsql-tr-genel(at)postgresql(dot)org>
>Gönderildiği Tarih: 9 Eylül 2013 16:16 Pazartesi
>Konu: [pgsql-tr-genel] Re: [pgsql-tr-genel] kümülatif toplam sorgusu
>
>
>
>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 | N. Can KIRIK | 2013-09-10 07:21:31 | Re: Yan: [pgsql-tr-genel] Re: [pgsql-tr-genel] kümülatif toplam sorgusu |
Previous Message | Devrim GÜNDÜZ | 2013-09-09 13:17:10 | PostgreSQL 9.3.0 duyuruldu. |