none
SQL iki farklı alt başlık arasında tarih ve detaylı sorgu RRS feed

  • Soru

  • Merhabalar,
    Benim birden fazla alt başlığım var.
    İki farklı sub_id'ye ait con_text içinde verilen iki tarih aralıklarını karşılaştırmak istiyorum.
    Bu iki farklı koşullar sağlanıyorsa 2 farklı satırın eşit tüm line_idlerini yazdırsın örnek: 
    eşleşmede sadece 2 satır eşleşti bu eşleşmeye ait satır numaraları
    372 line_id ile 373 line_id bu satırlardaki tüm veriler 
    + çıkan sonuçların con_type 1'e eşitse con_text'lerin içindeki değerleri toplatmak istiyorum.
    Tablom ektedir.
    Okumaya vakit ayırdığınız için teşekkür ederim.
    Cevaplarınızı bekliyorum.
    3 Aralık 2019 Salı 00:04

Tüm Yanıtlar

  • Merhabalar,

    Resim olarak değilde DDL olarak eklerseniz en azından daha net bir şekilde çözüme gidebiliriz.  con_text alanı gördüğüm kadarıyla veri tipi Nvarchar veya Varchar , Tarihleri buraya değilde ayrı bir alana eklemek daha mantıklı gibi geldi.

    3 Aralık 2019 Salı 08:26
  • İlginiz için teşekkür edeirm.
    Örnek :

    2019.12.23 olarak tarihleri kaydettim.
    Verileri sorgularkende convert(date, con_text, 103) şeklinde dönüştürdüm.

    Geriye kalan koşulları nasıl yapabilirim ?


    3 Aralık 2019 Salı 22:39
  • Merhabalar,

    Sizin dediğiniz şekilde yazarsak veri tip hatası vermez mi ? 

    Ben konuyu tam anlayamadım sizin paylaştığınız resimden ben tablo oluşturdum, bunun üzerinden gitmemiz hem konunun net bir şekilde çözüme kavuşmasını sağlar.

    DECLARE @TABLO TABLE 
    (
    con_id INT,
    menu_id INT,
    sub_id INT,
    line_id INT,
    con_text nvarchar(50),
    con_type INT
    )
    ;
    INSERT INTO  @TABLO
    VALUES('374','7','25','372','35CIHAN35','0'),
          ('375','7','26','372','40','1'),
    	  ('376','7','27','372','Cihan','0'),
    	  ('377','7','23','377','17.12.2019','0'),
    	  ('378','7','24','377','18.12.2019','0'),
    	  ('379','7','25','377','35CIHAN35','0'),
    	  ('380','7','26','377','45','1'),
    	  ('381','7','27','377','Cihan','0'),
    	  ('382','7','23','382','19.12.2019','0'),
    	  ('383','7','24','382','20.12.2019','0'),
    	  ('384','7','25','382','35CIHAN35','0'),
    	  ('385','7','26','382','50','1'),
    	  ('386','7','27','382','Cihan','0'),
    	  ('387','7','23','387','21.12.2019','0'),
    	  ('388','7','24','387','22.12.2019','0'),
    	  ('389','7','25','387','35CIHAN35','0'),
    	  ('390','7','26','387','55','1'),
    	  ('391','7','27','387','Cihan','0'),
    	  ('392','7','23','392','23.12.2019','0'),
    	  ('393','7','24','392','24.12.2019','0'),
    	  ('394','7','25','392','35CIHAN35','0'),
    	  ('395','7','26','392','60','1'),
    	  ('396','7','27','392','Cihan','0') 
    
    SELECT *
    FROM @TABLO
    
    

    4 Aralık 2019 Çarşamba 06:27
  • Sorunuz ne yazik ki hiç anlasilmiyor.

    Vedat beyin dedigi gibi resim degil de metin olarak verinizi ve nasıl bir ciktiya ulaşmak istediğinizi gösterirseniz belki bir sonuca varılabilir. Vedat beyin koduna belki ise yarar diye ben de bunu ekliyorum:

    select line_id, 
    convert(date,max(case when sub_id = 23 then con_text end), 104) as t1,
    convert(date,max(case when sub_id = 24 then con_text end), 104) as t2,
    max(case when sub_id = 25 then con_text end) as f25,
    max(case when sub_id = 26 then con_text end) as f26,
    max(case when sub_id = 27 then con_text end) as f27,
    max(con_type) as con_type
    FROM @TABLO
    group by line_id;
    



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    4 Aralık 2019 Çarşamba 09:35
  • select * from contents where sub_id=23 and con_text<='17.12.2019' or sub_id=24 and con_text<='18.12.2019' 
    bu yazdığım kodda çıkabilecek ekran çıktısı :
    con_id  | menu_id | sub_id | line_id | con_text        | con_type |
    377      | 7             | 23        | 377     |   17.12.2019 |     0          |
     378     | 7             | 24        | 377     |   18.12.2019 |     0          |                                                                             
    Şimdi bu çıkan çıktıda line_id kısmındaki değerler ve con_text ile eşleşen + con_type alanı eşit olan değerleri toplatmasını istiyorum.
    Koda dökerek anlatırsam : 
    select sum(convert(int,con_text)) as Toplam from contens where line_id=377 and con_type=1
    |Toplam|
    |45       |
    Şeklinde bir çıktı çıkar, tahmini.
    İlk çıktıda çıkacak farklı line_id'ler için aynı  sorguları tekrar girmek istemiyorum.
    İlginiz için teşekkür ederim.
    5 Aralık 2019 Perşembe 00:43
  • Merhaba,

    Öncelikle Çetin beyin konuya olan desteği için ben de teşekkür ederim. Aşağıdaki kodu deneyip sonucunu bizimle paylaşabilir misiniz.

    DECLARE @TABLO TABLE 
    (
    con_id INT,
    menu_id INT,
    sub_id INT,
    line_id INT,
    con_text nvarchar(50),
    con_type INT
    )
    ;
    INSERT INTO  @TABLO
    VALUES('374','7','25','372','35CIHAN35','0'),
          ('375','7','26','372','40','1'),
    	  ('376','7','27','372','Cihan','0'),
    	  ('377','7','23','377','17.12.2019','0'),
    	  ('378','7','24','377','18.12.2019','0'),
    	  ('379','7','25','377','35CIHAN35','0'),
    	  ('380','7','26','377','45','1'),
    	  ('381','7','27','377','Cihan','0'),
    	  ('382','7','23','382','19.12.2019','0'),
    	  ('383','7','24','382','20.12.2019','0'),
    	  ('384','7','25','382','35CIHAN35','0'),
    	  ('385','7','26','382','50','1'),
    	  ('386','7','27','382','Cihan','0'),
    	  ('387','7','23','387','21.12.2019','0'),
    	  ('388','7','24','387','22.12.2019','0'),
    	  ('389','7','25','387','35CIHAN35','0'),
    	  ('390','7','26','387','55','1'),
    	  ('391','7','27','387','Cihan','0'),
    	  ('392','7','23','392','23.12.2019','0'),
    	  ('393','7','24','392','24.12.2019','0'),
    	  ('394','7','25','392','35CIHAN35','0'),
    	  ('395','7','26','392','60','1'),
    	  ('396','7','27','392','Cihan','0') 
    
    SELECT P.*,T.*
    FROM @TABLO AS P
    OUTER APPLY
    (
    SELECT sum(convert(int,con_text)) as Toplam 
    FROM @TABLO C where C.line_id=P.line_id 
    AND con_type=1
    ) AS T
    WHERE sub_id IN(23,24)
    AND con_text>='17.12.2019' and con_text<='18.12.2019' 
    

     


    • Düzenleyen Vedat ÖZER 5 Aralık 2019 Perşembe 07:50
    5 Aralık 2019 Perşembe 07:39
  • select * from contents where sub_id=23 and con_text<='17.12.2019' or sub_id=24 and con_text<='18.12.2019' 
    bu yazdığım kodda çıkabilecek ekran çıktısı :
    con_id  | menu_id | sub_id | line_id | con_text        | con_type |
    377      | 7             | 23        | 377     |   17.12.2019 |     0          |
     378     | 7             | 24        | 377     |   18.12.2019 |     0          |                                                                             
    Şimdi bu çıkan çıktıda line_id kısmındaki değerler ve con_text ile eşleşen + con_type alanı eşit olan değerleri toplatmasını istiyorum.
    Koda dökerek anlatırsam : 
    select sum(convert(int,con_text)) as Toplam from contens where line_id=377 and con_type=1
    |Toplam|
    |45       |
    Şeklinde bir çıktı çıkar, tahmini.
    İlk çıktıda çıkacak farklı line_id'ler için aynı  sorguları tekrar girmek istemiyorum.
    İlginiz için teşekkür ederim.

    Hala tam anladigimdan emin degilim.

    Dikkat edin <= ile tarih karsilastirmasi yapiyorsunuz, bunu yapmadan once degerleri date\datetime'a ya da yyyy/MM/dd (ODBC canonical) formatina cevirmelisiniz, yoksa tarih olarak degil, alfabetik olarak karsilastirma yaparsiniz (ornegin 01.12.2019 <= 02.01.2019 olur).  

    SQL server'da ne yazık ki, arada tarih olmayan degerler de varken dogrudan tarihe çevirme islemiyle where kullanamıyorsunuz, araya ekstra bir basamak girecek:

    DECLARE @TABLO TABLE
    (
        con_id INT,
        menu_id INT,
        sub_id INT,
        line_id INT,
        con_text NVARCHAR(50),
        con_type INT
    );
    INSERT INTO @TABLO VALUES
    ('374', '7', '25', '372', '35CIHAN35', '0'),
    ('375', '7', '26', '372', '40', '1'),
    ('376', '7', '27', '372', 'Cihan', '0'),
    ('377', '7', '23', '377', '17.12.2019', '0'),
    ('378', '7', '24', '377', '18.12.2019', '0'),
    ('379', '7', '25', '377', '35CIHAN35', '0'),
    ('380', '7', '26', '377', '45', '1'),
    ('381', '7', '27', '377', 'Cihan', '0'),
    ('382', '7', '23', '382', '19.12.2019', '0'),
    ('383', '7', '24', '382', '20.12.2019', '0'),
    ('384', '7', '25', '382', '35CIHAN35', '0'),
    ('385', '7', '26', '382', '50', '1'),
    ('386', '7', '27', '382', 'Cihan', '0'),
    ('387', '7', '23', '387', '21.12.2019', '0'),
    ('388', '7', '24', '387', '22.12.2019', '0'),
    ('389', '7', '25', '387', '35CIHAN35', '0'),
    ('390', '7', '26', '387', '55', '1'),
    ('391', '7', '27', '387', 'Cihan', '0'),
    ('392', '7', '23', '392', '23.12.2019', '0'),
    ('393', '7', '24', '392', '24.12.2019', '0'),
    ('394', '7', '25', '392', '35CIHAN35', '0'),
    ('395', '7', '26', '392', '60', '1'),
    ('396', '7', '27', '392', 'Cihan', '0');
    
    WITH dates
    AS (SELECT sub_id,
               line_id,
               CONVERT(DATE, con_text, 104) AS con_text
        FROM @TABLO
        WHERE sub_id IN ( 23, 24 ))
    SELECT line_id, SUM(CONVERT(INT, con_text)) AS Toplam
    FROM @TABLO
    WHERE con_type = 1 AND line_id IN
              (
                  SELECT line_id
                  FROM dates
                  WHERE (sub_id = 23 AND con_text <= '20191217') OR
                        (sub_id = 24 AND con_text <= '20191218')
              )
    GROUP BY line_id;
    

    Umarım demek istediğiniz buydu.



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    5 Aralık 2019 Perşembe 09:08
  • Ekran çıktısı Veday bey.
    5 Aralık 2019 Perşembe 11:02
  • Resim olarak göndermenize gerek yok, zaten daha zor oluyor öyle. O kodları calistirip sonucun ne oldugunu biz görebiliyoruz zaten.

    Asil mesele sorunuzun cevabi oldu mu, olmadıysa olmayan ne? Bu son gönderdiğiniz soru mu mesela, yoksa "oldu" demek mi istiyorsunuz?



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    5 Aralık 2019 Perşembe 11:58
  • Vedat ÖZER ve CetinBasoz bey yardımlarınız için sizlere Çok Teşekkür ediyorum.
    Kalan kısımları C# ile halledeceğim.
    5 Aralık 2019 Perşembe 13:46
  • Vedat ÖZER Bey kusura bakmayın tekrar rahatsız ediyorum.
    Yazdığım kod : 

    select * from contents where menu_id=7 and con_type=4 and sub_id=23 and con_date>=CONVERT(date,'2019.09.06') and menu_id=7 and con_type=4 and  sub_id=24 and con_date<=CONVERT(date,'2019.12.02') ORDER BY con_id DESC

    Bu kod 0 sonuç döndürüyor.
    Nerede hata yapıyorum ?

    Cevabınızı bekliyorum. Teşekkür ederim.

    8 Aralık 2019 Pazar 12:25
  • Vedat ÖZER Bey kusura bakmayın tekrar rahatsız ediyorum.
    Yazdığım kod : 

    select * from contents where menu_id=7 and con_type=4 and sub_id=23 and con_date>=CONVERT(date,'2019.09.06') and menu_id=7 and con_type=4 and  sub_id=24 and con_date<=CONVERT(date,'2019.12.02') ORDER BY con_id DESC

    Bu kod 0 sonuç döndürüyor.
    Nerede hata yapıyorum ?

    Cevabınızı bekliyorum. Teşekkür ederim.

    Parantezlere, AND, OR'lara dikkat etmemişsiniz. Ayni satırda sub_id hem 23 hem 24 olamaz. 

    select * 
    from contents 
    where (menu_id=7 and 
          con_type=4 and 
          sub_id=23 and 
          con_date >= '20190906') OR 
          (menu_id=7 and 
          con_type=4 and  
          sub_id=24 and 
          con_date <= '20191202')
    ORDER BY con_id DESC;
    Not: Tam olarak kriterlerinizin ne oldugunu bilemiyorum tabii, kodunuzdan yaptıgım tahmin boyle. 



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    8 Aralık 2019 Pazar 15:16
  • Tekrar Teşekkür Ederim, CetinBasoz Bey.
    8 Aralık 2019 Pazar 19:20