none
isim verilmiş case when yapısı tekrar kullanmak RRS feed

  • Soru

  • merhabalar,

    aşağıdaki kod bloğundaki en alt satır hata döndürüyor. Yapmak istediğim case when ile oluşturulmuş bir kolonu tekrar bir case when içinde kullanmak. yardımlarını rica ederim. iyi çalışmalar

    CASE 
    WHEN STLINE.DATE_ >= '2017-01-05 00:00:00.000' AND STLINE.DATE_ <= '2018-04-30 00:00:00.000' THEN '2017-2018'
    WHEN STLINE.DATE_ >= '2018-01-05 00:00:00.000' AND STLINE.DATE_ <= '2019-04-30 00:00:00.000' THEN '2018-2019'
    WHEN STLINE.DATE_ >= '2019-01-05 00:00:00.000' AND STLINE.DATE_ <= '2020-04-30 00:00:00.000' THEN '2019-2020'
    WHEN STLINE.DATE_ >= '2020-01-05 00:00:00.000' AND STLINE.DATE_ <= '2021-04-30 00:00:00.000' THEN '2020-2021'
    ELSE '-' END AS 'SEZON',
    CASE WHEN STLINE.TRCODE in (2,3) then  MIKTAR2.AMOUNT * 1 WHEN STLINE.TRCODE in (7,8) THEN MIKTAR2.AMOUNT *-1 ELSE 0 END  AS MİKTAR2,
    
    CASE WHEN SEZON = '2017-2018' THEN MİKTAR2 ELSE 0 END AS '17-18 TONAJ'

    29 Kasım 2019 Cuma 08:46

Tüm Yanıtlar

  • Merhaba,

    Aşağıdaki şekilde deneyebilir misiniz. Eğer ki istediğiniz olmaz ise sorgunun tamamını paylaşırsanız net olarak yardımcı olabiliriz. Logo veri tabanı hakkında az da olsa bilgim var.

    SELECT *,
    CASE WHEN SEZON = '2017-2018' THEN  MİKTAR2 else 0 END AS '17-18 TONAJ' FROM (
    SELECT 
    CASE 
    WHEN STLINE.DATE_ >= '2017-01-05 00:00:00.000' AND STLINE.DATE_ <= '2018-04-30 00:00:00.000' THEN '2017-2018'
    WHEN STLINE.DATE_ >= '2018-01-05 00:00:00.000' AND STLINE.DATE_ <= '2019-04-30 00:00:00.000' THEN '2018-2019'
    WHEN STLINE.DATE_ >= '2019-01-05 00:00:00.000' AND STLINE.DATE_ <= '2020-04-30 00:00:00.000' THEN '2019-2020'
    WHEN STLINE.DATE_ >= '2020-01-05 00:00:00.000' AND STLINE.DATE_ <= '2021-04-30 00:00:00.000' THEN '2020-2021'
    ELSE '-' END AS 'SEZON',
    CASE WHEN STLINE.TRCODE in (2,3) then  MIKTAR2.AMOUNT * 1 WHEN STLINE.TRCODE in (7,8) THEN MIKTAR2.AMOUNT *-1 ELSE 0 END  AS MİKTAR2
    FROM LG_006_01_STLINE AS STLINE) AS TMP



    29 Kasım 2019 Cuma 11:16
  • O sekilde dogrudan kullanamazsınız, ilk Case'in olduğu bölümdeki sorguyu ya bir subquery (Vedat Ozer'in gösterdiği gibi) ya da bir CTE ile sanki ayrı bir tabloymuş gibi kullanarak yapabilirsiniz. Ya da sizin sorgunuz özelinde, sezon diye kullanmak yerine ayni sarti orada kullanabilirsiniz:

    CASE 
    WHEN STLINE.DATE_ >= '20170501' AND STLINE.DATE_ <= '20180430' THEN '2017-2018'
    WHEN STLINE.DATE_ >= '20180501' AND STLINE.DATE_ <= '20190430' THEN '2018-2019'
    WHEN STLINE.DATE_ >= '20190501' AND STLINE.DATE_ <= '20200430' THEN '2019-2020'
    WHEN STLINE.DATE_ >= '20200501' AND STLINE.DATE_ <= '20210430' THEN '2020-2021'
    ELSE '-' END AS 'SEZON',
    CASE WHEN STLINE.TRCODE in (2,3) then  MIKTAR2.AMOUNT * 1 WHEN STLINE.TRCODE in (7,8) THEN MIKTAR2.AMOUNT *-1 ELSE 0 END  AS MİKTAR2,
    
    CASE STLINE.DATE_ >= '20170501' AND STLINE.DATE_ <= '20180430' THEN MİKTAR2 ELSE 0 END AS '17-18 TONAJ'

    Tabii bunu daha basit de yazabilirsiniz:

    cast(year(date_) + case when month(date_) > 5 then 0 else -1 end as char(4))+'-'+  
    cast(year(date_) + case when month(date_) > 5 then 1 else 0 end as char(4))
    AS 'SEZON',
    CASE WHEN STLINE.TRCODE in (2,3) then  MIKTAR2.AMOUNT * 1 WHEN STLINE.TRCODE in (7,8) THEN MIKTAR2.AMOUNT *-1 ELSE 0 END  AS MİKTAR2,
    CASE STLINE.DATE_ >= '20170501' AND STLINE.DATE_ <= '20180430' THEN MİKTAR2 ELSE 0 END AS '17-18 TONAJ'
    

    Not: Sizin SQL'de tarihler yanlış gibi, degilse üst üste binen alanlar var. Bir de tarihleri o sekilde degil de benim yazdigim sekilde yazarsanız hata sansini ortadan kaldirirsiniz (MS SQL server'in bazı sürümlerinde, ve language ayarlarına gore sizin yazdiginiz sekli yanlış degerlendirilebiliyor).



    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.

    29 Kasım 2019 Cuma 13:25