Re: Yan: [pgsql-tr-genel] 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: Yan: [pgsql-tr-genel] Re: [pgsql-tr-genel] kümülatif toplam sorgusu
Date: 2013-09-10 07:21:31
Message-ID: CAJ1wP5kPm-mjraCut0WmgVGULqN+LizURFAPhFqaNSk3JrtL2g@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-tr-genel

Faydam olduysa ne mutlu bana...

İyi çalışmalar...

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

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

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

Responses

Browse pgsql-tr-genel by date

  From Date Subject
Next Message RecNes 2013-09-10 11:10:48 Postgresql server optimizasyonu için Türkçe dokümantasyon?
Previous Message Uygar UZUNHASAN 2013-09-10 05:49:48 Yan: [pgsql-tr-genel] Re: [pgsql-tr-genel] kümülatif toplam sorgusu