none
Sql Aylık,3 Aylık ve Yıllık veri çekme RRS feed

  • Soru

  • Merhaba arkadaşlar, yardımcı olacak arkadaşlara şimdiden teşekkür ederim.

    İki tarih arasındaki veriyi aylık, 3 aylık ve yıllık olarak listelemem gerekiyor. Biraz araştırdım fakat çözemedim. Yardımcı olabilirseniz sevinirim.

    26 Ekim 2016 Çarşamba 18:29

Yanıtlar

  • Merhabalar,

    Eğer doğru anladıysam girilen baslangic ve bitis tarihleri aralığında aylık, çeyreklik ve yıllık tutarları listelemek istiyorsunuz. Aşağıdaki yapıyı kendi tablonuza uyarlayarak deneyebilir misiniz?

    Aylık için;

    declare @baslangic datetime = '20120101'
    declare @bitis datetime = '20130520'
    
    select tarih, MAX(kur)
    from tbl
    where tarih in
    	(
    	select EOMONTH(tarih) as ay
    	from tbl
    	where tarih >= @baslangic and tarih <= @bitis
    	group by EOMONTH(tarih)
    	)
    group by tarih
    order by tarih
    

    Çeyreklik için;

    declare @baslangic datetime = '20120101'
    declare @bitis datetime = '20130520'
    
    select tarih, MAX(kur)
    from tbl
    where tarih in 
    (
    	select CONVERT(DATE,DATEADD(d, -1, DATEADD(q, DATEDIFF(q, 0, tarih) +1, 0))) as ceyrek
    	from tbl
    	where tarih >= @baslangic and tarih <= @bitis
    	group by CONVERT(DATE,DATEADD(d, -1, DATEADD(q, DATEDIFF(q, 0, tarih) +1, 0))) 
    )
    group by tarih
    order by tarih

    Yıllık için;

    declare @baslangic datetime = '20120101'
    declare @bitis datetime = '20130520'
    
    select tarih, MAX(kur)
    from tbl
    where tarih in 
    (
    	select DATEADD(yy, DATEDIFF(yy,0,tarih) + 1, -1) as yil
    	from tbl
    	where tarih >= @baslangic and tarih <= @bitis
    	group by DATEADD(yy, DATEDIFF(yy,0,tarih) + 1, -1)
    )
    group by tarih
    order by tarih
    

    Umarım faydalı olur...


    Please Mark This As Answer if it solved your issue
    Please Vote This As Helpful if it helps to solve your issue
    www.abdullahaltintas.com

    • Yanıt Olarak İşaretleyen Umut Duran 30 Ekim 2016 Pazar 13:13
    27 Ekim 2016 Perşembe 11:17

Tüm Yanıtlar

  • Ayları 

    ,case 
    	  when Month(Tarih)<4 then '01' 
    	  when Month(Tarih)>3 and Month(Tarih)<7 then '02' 
    	  when Month(Tarih)>6 and Month(Tarih)<10 then '03' 
    	  when Month(Tarih)>9 then '04' 
    	  end as donem

    diyerek dönemlere ayırabilirsin. Tarihin de yılını alıp varchara cast edip bu dönemlerle toplayarak yıllara ve aylara göre guruplayabilirsin.

    Select istenenalanlar from (select diger_alanlar,
    (Cast(Year(Tarih) as varchar)+
    case 
    	  when Month(Tarih)<4 then '01' 
    	  when Month(Tarih)>3 and Month(Tarih)<7 then '02' 
    	  when Month(Tarih)>6 and Month(Tarih)<10 then '03' 
    	  when Month(Tarih)>9 then '04' 
    	  end as donem) as yildonem from table) as t
    group by yildonem

    gibi


    http://pgnchess.com
    http://dergikapaklari.com

    26 Ekim 2016 Çarşamba 20:21
  • Aylik:

    Select * from TabloAdi
    where Month(Tarih) = @istenenAy and
          Year(Tarih) = @istenenYil;
    

    3 Aylik:

    Select * from TabloAdi
    where DatePart(quarter, Tarih) = @istenenDonem and year(Tarih) = @istenenYil;
    

    Yillik:

    Select * from TabloAdi
    where Year(Tarih) = @istenenYil;
    


    • Düzenleyen CetinBasoz 26 Ekim 2016 Çarşamba 20:37
    26 Ekim 2016 Çarşamba 20:36
  • Ayları 

    ,case 
    	  when Month(Tarih)<4 then '01' 
    	  when Month(Tarih)>3 and Month(Tarih)<7 then '02' 
    	  when Month(Tarih)>6 and Month(Tarih)<10 then '03' 
    	  when Month(Tarih)>9 then '04' 
    	  end as donem

    diyerek dönemlere ayırabilirsin. Tarihin de yılını alıp varchara cast edip bu dönemlerle toplayarak yıllara ve aylara göre guruplayabilirsin.

    Select istenenalanlar from (select diger_alanlar,
    (Cast(Year(Tarih) as varchar)+
    case 
    	  when Month(Tarih)<4 then '01' 
    	  when Month(Tarih)>3 and Month(Tarih)<7 then '02' 
    	  when Month(Tarih)>6 and Month(Tarih)<10 then '03' 
    	  when Month(Tarih)>9 then '04' 
    	  end as donem) as yildonem from table) as t
    group by yildonem

    gibi


    http://pgnchess.com
    http://dergikapaklari.com


    Yardım için teşekkür ederim fakat tam anlayamadım. Örneğin 01.01.2016 ve 31.12.2016 tarihleri arası çıktı nasıl olacaktır bu yazdığınız gibi olduğunda ? Kusura bakmayın uygulayıp deneyemedim çünkü çözemedim yazdığınızı.
    26 Ekim 2016 Çarşamba 20:39
  • Aylik:

    Select * from TabloAdi
    where Month(Tarih) = @istenenAy and
          Year(Tarih) = @istenenYil;

    3 Aylik:

    Select * from TabloAdi
    where DatePart(quarter, Tarih) = @istenenDonem and year(Tarih) = @istenenYil;

    Yillik:

    Select * from TabloAdi
    where Year(Tarih) = @istenenYil;


    Diğer arkadaşa göre daha basit anlatmışsınız çok teşekkür ederim fakat son bir sorum olacak. Mesela aylık listeleme seçilen iki tarih arasında ki ayları listeleme şeklinde olacak. 3 aylıkta aynı şekilde seçilen iki tarih arasında ki değerleri 3 aylık olarak listeleme olacak. Yıl olarakta aynı şekilde iki tarih arasındaki değerleri yıl bazında listeleyecek yani 2011-2016 dendiyse aradaki yılları listeleyecek. Bu şekilde de yazmanızı rica etmem mümkün mü ?
    26 Ekim 2016 Çarşamba 20:45
  • Yazmasina yazalim da. ne istedigin net olarak anlasilmiyor. Ornek versen iyi olur.
    27 Ekim 2016 Perşembe 00:13
  • Yazmasina yazalim da. ne istedigin net olarak anlasilmiyor. Ornek versen iyi olur.

    Örneğin iki tane textbox var. Birisi başlangıç tarihi diğeride bitiş tarihi olarak seçiliyor. Bir sene içinde ki bütün dolar kur değişimlerini gün gün veri tabanında kayıt ettim. 01.01.2011 başlangıç 01.01.2016 bitiş tarihi olsun. bir dropdownda ise aylık- 3 aylık ve yıllık listeleme şeklini seçiyoruz.Gelen verileri aylık olarak her ayın son gününü baz alacak şekilde çekecek. 3 aylıklarda da aynı mantık 3. ayın son gününü baz alacak sürekli. yıllıklarda da yılın son gününü baz alarak listeleyecek.

    Mesela Aylık

    31.01.2011 - 2.26 TL

    31.02.2011 - 2.30 TL

    3 Aylık

    31.03.2011 - 2.50 TL

    31.06.2011 - 2.55 TL

    Senelik

    31.12.2011 - 3.00 TL

    31.12.2012 - 2.225 TL

    gibi listeleme yapacak.

    27 Ekim 2016 Perşembe 06:57
  • Merhabalar,

    Eğer doğru anladıysam girilen baslangic ve bitis tarihleri aralığında aylık, çeyreklik ve yıllık tutarları listelemek istiyorsunuz. Aşağıdaki yapıyı kendi tablonuza uyarlayarak deneyebilir misiniz?

    Aylık için;

    declare @baslangic datetime = '20120101'
    declare @bitis datetime = '20130520'
    
    select tarih, MAX(kur)
    from tbl
    where tarih in
    	(
    	select EOMONTH(tarih) as ay
    	from tbl
    	where tarih >= @baslangic and tarih <= @bitis
    	group by EOMONTH(tarih)
    	)
    group by tarih
    order by tarih
    

    Çeyreklik için;

    declare @baslangic datetime = '20120101'
    declare @bitis datetime = '20130520'
    
    select tarih, MAX(kur)
    from tbl
    where tarih in 
    (
    	select CONVERT(DATE,DATEADD(d, -1, DATEADD(q, DATEDIFF(q, 0, tarih) +1, 0))) as ceyrek
    	from tbl
    	where tarih >= @baslangic and tarih <= @bitis
    	group by CONVERT(DATE,DATEADD(d, -1, DATEADD(q, DATEDIFF(q, 0, tarih) +1, 0))) 
    )
    group by tarih
    order by tarih

    Yıllık için;

    declare @baslangic datetime = '20120101'
    declare @bitis datetime = '20130520'
    
    select tarih, MAX(kur)
    from tbl
    where tarih in 
    (
    	select DATEADD(yy, DATEDIFF(yy,0,tarih) + 1, -1) as yil
    	from tbl
    	where tarih >= @baslangic and tarih <= @bitis
    	group by DATEADD(yy, DATEDIFF(yy,0,tarih) + 1, -1)
    )
    group by tarih
    order by tarih
    

    Umarım faydalı olur...


    Please Mark This As Answer if it solved your issue
    Please Vote This As Helpful if it helps to solve your issue
    www.abdullahaltintas.com

    • Yanıt Olarak İşaretleyen Umut Duran 30 Ekim 2016 Pazar 13:13
    27 Ekim 2016 Perşembe 11:17
  • Evet simdi cok guzel anlatmissin, net olarak elinde ne oldugu ve ne istedigin anlasiliyor. Ozetlersek:

    • Gun gun kaydettim demissin. Yani tabloda her gun icin bir kayit var ve herhangi bir gunde sadece tek bir kayit var. 
    • Sadece ayin son gunune denk gelenler listelenecek.
    • Secilen duruma gore aylik (1...12. aylar), donemlik (3,6,9,12. aylar) ya da (12.ay) olacak.
    • (Soru SQL server forumunda soruldugu icin) Cozum T-SQL ile olacak.
    • Belli bir baslangic bitis tarih araligi olacak.

    Oncelikle hemen uyarayim, 2 tane textbox ile baslangic ve bitis tarihi alma, datetimepicker kullan. Sonucta parametre olarak baslangic, bitis ve aylik-donem-yillik gibi bir secim parametre olarak gelip sonuc istiyorsun. Tablonun adinin Kurlar oldugunu dusunursek (geriye dogru maksimum 10 yillik veri icin):

    DECLARE @baslangic DATETIME = '20110101';
    DECLARE @bitis DATETIME = '20160101';
    DECLARE @secimTipi INT = 0; -- 0 Yillik, 1 3Aylik, 2 Aylik
    
    WITH    tarihler ( tarih )
              AS ( SELECT TOP ( 10 * 366 )
                            CAST(DATEADD(d,
                                         1
                                         - ( ROW_NUMBER() OVER ( ORDER BY t1.object_id ) ),
                                         GETDATE()) AS DATE)
                   FROM     master.sys.all_columns t1
                            CROSS JOIN master.sys.all_columns t2
                 ),
            sonGunler ( tarih )
              AS ( SELECT   tarih
                   FROM     tarihler
                   WHERE    tarih >= @baslangic
                            AND tarih <= @bitis
                            AND DATEADD(d, -DAY(DATEADD(m, 1, tarih)),
                                        DATEADD(m, 1, tarih)) = tarih
                            AND ( ( @secimTipi = 0
                                    AND DATEPART(MONTH, tarih) IN ( 12 )
                                  )
                                  OR ( @secimTipi = 1
                                       AND DATEPART(MONTH, tarih) IN ( 3, 6, 9, 12 )
                                     )
                                  OR ( @secimTipi = 2
                                       AND DATEPART(MONTH, tarih) IN ( 1, 2, 3, 4,
                                                                  5, 6, 7, 8, 9,
                                                                  10, 11, 12 )
                                     )
                                )
                 )
        SELECT  *
        FROM    Kurlar
        WHERE   EXISTS ( SELECT *
                         FROM   sonGunler
                         WHERE  sonGunler.tarih = Kurlar.tarih );
    

    Not : Bu isin, ornegin C# tarafinda, Linq ile yazimi cok daha basit ama bu kadar az veride nasil olsa milisaniyelik is.
    • Düzenleyen CetinBasoz 27 Ekim 2016 Perşembe 14:30
    27 Ekim 2016 Perşembe 14:23
  • Teşekkür ediyorum. Bu şekilde oldu istediğim. Yanıtlayan herkes sağolsun :)
    30 Ekim 2016 Pazar 13:13