none
sql de ardışık olarak giden tarihleri nasıl saydırabilirm RRS feed

  • Soru

  • yani şöyle bir tablom var

    günler

    1  2  3  4  5  6  7  8  9  10 11 12  13

    x  x  x       x  x               x   x  x  

    gibi bir tablo burda x ler normalde count() ile sayıldığında 8 olarak verir

    ama ben bunu 3 kez saydırmak istiyorum yani ardışık ve peşpeşe girilen x ler bana 1 kayıt olarak gelsin

    yardımcı olursanız sevinirim şimdiden teşekkürler.... bilgin


    16 Mayıs 2013 Perşembe 07:27

Yanıtlar

  • Öncelikle tabloyu Ay - Gün - Değer şekline dönüştürmen gerekiyor. Eğer bu şekildeyse sorun yok. Dönüştürme işlemini UNPIVOT ile aşağıdaki gibi yapabilirsin.

    SELECT Ay,GunNo,Deger INTO #t1 FROM Gun
    UNPIVOT(Deger FOR GunNo in ([1],[2],[3],[4],[5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15])) t

    Bunu 31'e kadar yazman gerekiyor. Böylece her ayın her gününü ve o güne ait 1 ve 0 değerlerini döndüren bir tablo / view oluşturmuş olursun. Sonra bu tabloyu aşağıdaki gibi kendisiyle LEFT JOIN edip her günün karşısında kendisinden bir önceki günü getirmen gerekiyor. WHERE bölümünü de kendisi ve bir önceki kaydı farklı olanları alacaksın. Sonra 1 ve 0 olanları topladığında COUNT değerini elde etmiş olursun.

    SELECT a.Ay,SUM(a.Deger) FROM #t1 a LEFT JOIN #t1 b ON a.Ay=b.Ay AND a.GunNo-1=b.GunNo
    WHERE a.Deger<>ISNULL(b.Deger,0)
    GROUP BY a.Ay


    Ahmet Kaymaz
    http://www.ahmetkaymaz.com
    C# VB.NET ASP.NET kitabı

    16 Mayıs 2013 Perşembe 12:56

Tüm Yanıtlar

  • Merhaba Bilgin,

    Yapmak istedigin yapiyi genel olarak anladim ama baska detaylar ayrintilar olabilecegi icin cok emin degilim. Eger daha detayli bilgi ve ornek verirsen daha net yardimci olabilirim veya baska arkadaslar yardimci olabilir. Benim anladigim kadariyla ardisik gruplarin sayisini bulmaya calisiyorsun. Bunun cicin ardisik grubun son uyesine bakman yeterli bence. Yani bir ardisik grubun son uyesinin kendisinden once mutlaka bir uyesi olmasi gerek ve kendinden bir sonra da olmamasi lazim. Soyle bir SUM isinizi gorur diye tahmin ediyorum

    SELECT Sum(cnt) 
    FROM   (SELECT CASE 
                     WHEN Kolon = 'X' 
                          AND (SELECT Kolon 
                               FROM   Tabloadi 
                               WHERE  gunler = A.gunler - 1) = 'X' 
                          AND (SELECT Kolon 
                               FROM   TabloAdi
                               WHERE  gunler = A.gunler + 1) IS NULL THEN 1 
                     ELSE 0 
                   END AS cnt 
            FROM   TabloAdi A	) B 

    16 Mayıs 2013 Perşembe 09:54
  • Merhaba Bilgin,

    Yapmak istedigin yapiyi genel olarak anladim ama baska detaylar ayrintilar olabilecegi icin cok emin degilim. Eger daha detayli bilgi ve ornek verirsen daha net yardimci olabilirim veya baska arkadaslar yardimci olabilir. Benim anladigim kadariyla ardisik gruplarin sayisini bulmaya calisiyorsun. Bunun cicin ardisik grubun son uyesine bakman yeterli bence. Yani bir ardisik grubun son uyesinin kendisinden once mutlaka bir uyesi olmasi gerek ve kendinden bir sonra da olmamasi lazim. Soyle bir SUM isinizi gorur diye tahmin ediyorum

    SELECT Sum(cnt) 
    FROM   (SELECT CASE 
                     WHEN Kolon = 'X' 
                          AND (SELECT Kolon 
                               FROM   Tabloadi 
                               WHERE  gunler = A.gunler - 1) = 'X' 
                          AND (SELECT Kolon 
                               FROM   TabloAdi
                               WHERE  gunler = A.gunler + 1) IS NULL THEN 1 
                     ELSE 0 
                   END AS cnt 
            FROM   TabloAdi A	) B 

    teşekkürler ali kardeşim ilgilendiğin için deneyip hemen dönecem


    bilgin aşağıdaki gibi bir tablo düşün 1 olanları tek saysın bu bir asp sayfası çıktısıdır.


    select SicilNo,Tarih,count(Dmzlzni) from puan
    where SicilNo='5101144' and Tarih>='01/01/2013'
    group by SicilNo,Tarih
    having count(Dmzlzni)>0

    aslında ben bir kişinin toplam kayıt sayısını tarihe göre alabiliyorum

    bu sorguda 

    SicilNo Tarih                                  (No column name)
    5101144 2013-01-09 00:00:00.000 1
    5101144 2013-01-10 00:00:00.000 1
    5101144 2013-01-16 00:00:00.000 1
    5101144 2013-01-28 00:00:00.000 1
    5101144 2013-02-22 00:00:00.000 1
    5101144 2013-02-26 00:00:00.000 1
    5101144 2013-03-05 00:00:00.000 1
    5101144 2013-03-06 00:00:00.000 1
    5101144 2013-03-19 00:00:00.000 1
    5101144 2013-03-20 00:00:00.000 1
    5101144 2013-03-21 00:00:00.000 1
    5101144 2013-03-22 00:00:00.000 1
    5101144 2013-04-01 00:00:00.000 1
    5101144 2013-04-02 00:00:00.000 1
    5101144 2013-04-03 00:00:00.000 1
    5101144 2013-04-04 00:00:00.000 1
    5101144 2013-04-05 00:00:00.000 1
    5101144 2013-04-09 00:00:00.000 1
    5101144 2013-04-12 00:00:00.000 1
    5101144 2013-04-30 00:00:00.000 1


    böyle bir sonuç çıkıyor ama birleri örneğin tek bir gündeki kayıt 1 olarak geliyor orda tamam

    ama ardışık olarak girilmiş kayıtlarda bana 1 olarak gelsin yani yukardaki sonuç gibi değil

    hani tablomda izin başlangıç ve bitiş tarihi kolonları olmadığı için gereken veriyi alamıyorum

    16 Mayıs 2013 Perşembe 10:17
  • Öncelikle tabloyu Ay - Gün - Değer şekline dönüştürmen gerekiyor. Eğer bu şekildeyse sorun yok. Dönüştürme işlemini UNPIVOT ile aşağıdaki gibi yapabilirsin.

    SELECT Ay,GunNo,Deger INTO #t1 FROM Gun
    UNPIVOT(Deger FOR GunNo in ([1],[2],[3],[4],[5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15])) t

    Bunu 31'e kadar yazman gerekiyor. Böylece her ayın her gününü ve o güne ait 1 ve 0 değerlerini döndüren bir tablo / view oluşturmuş olursun. Sonra bu tabloyu aşağıdaki gibi kendisiyle LEFT JOIN edip her günün karşısında kendisinden bir önceki günü getirmen gerekiyor. WHERE bölümünü de kendisi ve bir önceki kaydı farklı olanları alacaksın. Sonra 1 ve 0 olanları topladığında COUNT değerini elde etmiş olursun.

    SELECT a.Ay,SUM(a.Deger) FROM #t1 a LEFT JOIN #t1 b ON a.Ay=b.Ay AND a.GunNo-1=b.GunNo
    WHERE a.Deger<>ISNULL(b.Deger,0)
    GROUP BY a.Ay


    Ahmet Kaymaz
    http://www.ahmetkaymaz.com
    C# VB.NET ASP.NET kitabı

    16 Mayıs 2013 Perşembe 12:56
  • teşekkürler ilgilendiğiniz için işimi gördü saolun süpersiniz

    bilgin


    16 Mayıs 2013 Perşembe 13:35
  • elimde uzun bir sql cümlesi var text doyada ben bunu asp ile çalıştırmak istiyorum nasıl yapabilirim



    bilgin

    6 Aralık 2013 Cuma 07:25
  • peki üst üste iki aya aynı değer girildiyse bunu nasıl ayıracaz

    bilgin

    27 Haziran 2014 Cuma 08:00