2015-07-31 5 views
0

У меня есть вопрос, который вы найдете ниже. Как вы видите, проверка функции case на 1 значение.Когда функция с двумя тестами

SUM(case when reknr '8980' then bdr_hfl * -1 end) as Y, 

Однако я бы хотел протестировать 2 вещи.

SUM (случай (когда reknr '8980') и (Dagbk не равно нулю), то bdr_hfl * -1 конец), как Y,

Я попробовал несколько вариант, но не может получить правильный результат.

Благодарим за помощь.

Добавить. Информация. Я попробовал вариант с местом расположения правых брекетов. К сожалению, он не работает. Я получаю Неоднозначность. Когда мне нравится GBk. infront of dagbkrn - функция кода. Однако я не получаю правильный результат. Похоже, он не проверяет вторую часть.

select GBK.bkstnr_sub as Ordernummer, 
     PRP.ParentProject as Project, 
      ORK.orddat as Orderdatum, 
      ORK.sysguid as OrderGUID, 

      ORK.pakbon_dat as OrderAfleverdatum, 
      MAX(FHK.fakdat) as Faktuurdatum, 

      Datepart(week,(ORK.orddat))as Week, 
      ORK.ord_debtor_name as Klant, 
      ORK.docnumber, 
     SUM(case when (reknr BETWEEN '  8000' AND '  8980') and (dagbknr IS not null) then GBK.bdr_hfl * -1 end) as Omzet, 
     SUM(case when reknr BETWEEN '  7000' AND '  7980' then GBK.bdr_hfl end) as kostprijs, 

     (Case when (SUM(case when reknr BETWEEN '  8000' AND '  8980' then GBK.bdr_hfl * -1 end)) <> 0 then 
     (1-(((SUM(case when reknr BETWEEN '  7000' AND '  7980' then GBK.bdr_hfl end))/ 
     (SUM(case when reknr BETWEEN '  8000' AND '  8980' then GBK.bdr_hfl * -1 end)))))*100 end) as Marge, 


     GETDATE() as Datum, 
     DATEDIFF(day,GETDATE(),ORK.pakbon_dat) as Dagen 
from [040].dbo.gbkmut as GBK with (nolock) 
     left join [040].dbo.orkrg as ORK with (nolock) on ORK.ordernr = GBK.bkstnr_sub 
     left join [040].dbo.frhkrg as FHK with (nolock) on ORK.ordernr = FHK.ordernr 
     left join [040].dbo.PRProject as PRP with (nolock) on PRP.ProjectNr = ORK.projectnr 

where (GBK.dagbknr = 50 or GBK.dagbknr = 40) and ork.ordernr = '15104231' and 
     GBK.bkstnr_sub in (
      Select ordernr 
      from [040].dbo.orkrg 
      where ord_soort = 'V' and 
        status = 'A' and 
        YEAR(orddat)> '2014') 
     and ORK.productline is null 
     and DATEDIFF(day,GETDATE(),ORK.pakbon_dat) <-45 

Group by GBK.bkstnr_sub,PRP.ParentProject,ORK.sysguid,ORK.orddat,ORK.pakbon_dat,Datepart(week,(ORK.orddat)), ORK.ord_debtor_name,ORK.docnumber -- order by Datepart(week,(ORK.orddat)) 
+2

Вы Погружает '=' 'между reknr' и' '8980''? –

+0

@GordonLinoff Это не скомпилируется, но OP не упоминает ошибку, но неверный результат, я предполагаю, что OP забыл добавить 'else 0' (или что бы это ни было)? – artm

+0

Какой у вас результат? – AXMIM

ответ

1
SELECT SUM(CASE WHEN reknr = '8980' AND Dagbk IS NOT NULL THEN bdr_hfl * -1 END) AS Y 
FROM [Insert your table here] 

Глядя на обновленной версии, я вижу, вы пытаетесь использовать между с типом VARCHAR. Это не будет работать, как вы ожидаете, потому что это сравнение символов

Рассмотрите возможность использования вместо этого:

CASE WHEN CONVERT(DECIMAL, ISNULL(reknr, '0')) BETWEEN 8000 AND 8980 THEN GBK.bdr_hfl * -1 END 
+0

Обновлен мой ответ, чтобы обработать случай, когда reknr равно null, если это возможно – AXMIM

0

Синтаксис сазе, по существу, это:

CASE WHEN <condition> THEN <true_value> [ELSE <false_value>] END 

<condition> может быть один или несколько положений. Ваша проблема заключается в размещении скобок, по существу: первое заключенное в скобки предложение в условии не должно включать WHEN, которое на самом деле является частью синтаксиса для оператора CASE.

Попробуйте следующие вместо:

SUM(CASE WHEN (reknr = '8980') AND (dagbk IS NOT NULL) THEN bdr_hfl * -1 END) AS Y,