2015-08-16 2 views
2

Я пытаюсь получить вложенный оператор case для работы, который поэтапно работает, но теперь я вложил в другой оператор case, который жалуется на синтаксис. Я просмотрел множество примеров и не вижу, где я ошибся.SQL-строка в столбце с использованием вложенного оператора Case

То, что я хочу достичь, - это строка для PolicyTransactionId (устанавливается в предложении where) с каждым кодом учетной записи в виде столбца. Это сработало для меня, когда он превращается в ошибку, добавляет вложенную запись, чтобы посмотреть запись дебетования/кредита и, при необходимости, превратить номер в отрицательный.

Попытка до сих пор прилагается.

http://sqlfiddle.com/#!6/8db47/3

CREATE TABLE [dbo].[PolicyTransactionSplits](
    [PolicyTransactionSplitId] [int] NOT NULL, 
    [PolicyTransactionId] [int] NOT NULL, 
    [AccountCode] [int] NOT NULL, 
    [AccountDesc] [nvarchar](max) NULL, 
    [TransactionType] [nvarchar](max) NULL, 
    [Amount] [decimal](18, 2) NOT NULL, 
    [Adjusted] [bit] NOT NULL DEFAULT ((0)) 
) 
; 



INSERT INTO PolicyTransactionSplits 
    ([PolicyTransactionSplitId], [PolicyTransactionId], [AccountCode], [AccountDesc], [TransactionType], [Amount], [Adjusted]) 
VALUES 
(1551,1096,1000,'Total Transaction Premium','Debit',50,0), 
(1552,1096,1010,'Total Net Premium','Debit',50,0) 
; 

...

select 
    max(case when AccountCode = 1000 then case when TransactionType = 'Debit' then Amount end else case when AccountCode = 1000 then case when TransactionType = 'Credit' then Amount*-1 end) [Total Transaction Premium] 
    max(case when AccountCode = 1000 then case when TransactionType = 'Debit' then Amount end else case when AccountCode = 1000 then case when TransactionType = 'Credit' then Amount*-1 end) [Total Transaction Premium] 
from PolicyTransactionSplits 
where PolicyTransactionId = 10 
+0

Вы, скрипка, выглядят как преднамеренная попытка создать нечитаемый код. Используйте правильное изобретательство, отдельные логические высказывания с круглыми скобками, тогда вы сами найдете проблему. – Amit

+0

решена на http://sqlfiddle.com/#!6/8db47/17 –

ответ

2

Вам не нужно гнездиться case заявления:

select max(case when AccountCode = 1000 and TransactionType = 'Debit' 
       then amount 
       when AccountCode = 1000 and TransactionType = 'Credit' 
       then Amount * -1 
      end) as [Total Transaction Premium], 
     max(case when AccountCode = 1000 and TransactionType = 'Debit' 
       then Amount 
       when AccountCode = 1000 and TransactionType = 'Credit' 
       then Amount * -1 
      end) as [Total Transaction Premium] 
from PolicyTransactionSplits 
where PolicyTransactionId = 10; 

Неясно мне, почему вы повторяете ту же логику. Возможно, вам просто нужно:

select max(case when TransactionType = 'Debit' 
       then amount 
       when TransactionType = 'Credit' 
       then Amount * -1 
      end) as [Total Transaction Premium] 
from PolicyTransactionSplits 
where PolicyTransactionId = 10 and AccountCode = 1000; 
+0

Спасибо Гордону, что верхушка именно то, что мне нужно (имеет смысл, но не может попасть туда). Повторяющаяся логика - это ошибка копирования/вставки. У меня есть 20+ строк за транзакцию по разным кодам/дебатам. Я просто попытался упростить его, чтобы получить ответ, а не дать всю мою процедуру. –

1

Вы получите ошибку синтаксиса, потому что не хватает 2 end заявления и запятая в конце первой строки, а ваша логика Безразлично Не имеет большого значения, потому что это так:

case when AccountCode = 1000 then 
    case when TransactionType = 'Debit' then Amount end 
else 
    case when AccountCode = 1000 then 
    case when TransactionType = 'Credit' then Amount*-1 end 
    end 
end 

Yo u'll никогда не добирается до второй части, потому что AccountCode = 1000 является критерием в обоих случаях. Может быть, вы ищете это?

case when AccountCode = 1000 then 
    case when TransactionType = 'Debit' then Amount 
     when TransactionType = 'Credit' then Amount*-1 
    end 
end 
Смежные вопросы