Re: [pgsql-tr-genel] 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: Recep KIRMIZI <rkirmizi(at)gmail(dot)com>
Cc: Uygar UZUNHASAN <uygaruzunhasan(at)yahoo(dot)com>, "pgsql-tr-genel(at)postgresql(dot)org" <pgsql-tr-genel(at)postgresql(dot)org>
Subject: Re: [pgsql-tr-genel] Re: Yan: [pgsql-tr-genel] Re: [pgsql-tr-genel] kümülatif toplam sorgusu
Date: 2013-09-14 10:25:22
Message-ID: CAJ1wP5nhoP0JvDbgZTGp0uV-LX1o7G2ZwcQ11=VqzzXAX93CWA@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-tr-genel

:D ufak tefek şeylerin lafı bile olmaz. yine de teşekkürler, ama dersen ki
yine de yemek yiyelim, ben ısmarlarım olmazsa...

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

2013/9/10 Recep KIRMIZI <rkirmizi(at)gmail(dot)com>

> Yanlış anlaşılma olmasın, bu bilgi tabi ki bir yemekten çok daha değerli
> ama bilgi paylaşımının artması açısından teşvik edici olabilir :D
>
>
> 10 Eylül 2013 14:44 tarihinde Recep KIRMIZI <rkirmizi(at)gmail(dot)com> yazdı:
>
> Bence arkadaş bir yemeği hak etti :D
>>
>>
>> 10 Eylül 2013 10:21 tarihinde N. Can KIRIK <can(at)epati(dot)com(dot)tr> yazdı:
>>
>> 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
>>>>
>>>>
>>>>
>>>>
>>>>
>>>
>>
>>
>> --
>> Saygılarımla... Recep KIRMIZI
>>
>
>
>
> --
> Saygılarımla... Recep KIRMIZI
>

In response to

Browse pgsql-tr-genel by date

  From Date Subject
Next Message Uygar UZUNHASAN 2013-10-22 13:09:08 Servisi başlatamıyorum
Previous Message Recep KIRMIZI 2013-09-10 11:45:28 Re: [pgsql-tr-genel] Re: Yan: [pgsql-tr-genel] Re: [pgsql-tr-genel] kümülatif toplam sorgusu