Использование case в выражении sql select - PullRequest
1 голос
/ 21 сентября 2010

Рассмотрим таблицу с количеством столбцов,

Amount
-1235.235
1356.45
-133.25
4565.50
5023
-8791.25

Я хочу, чтобы моя панель результатов была такой,

Debit   Credit
  0     -1235.235
1356.45  0 
  0     -133.25

Вот моя хранимая процедура,

USE [HotelBI_CustomDB]
GO
  SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[SP_GetJVReport](
@p_FromDate datetime,
@p_ToDate datetime
)
AS
BEGIN
select jv.AccountNo,jv.AccountNoTitle,(select JV_GroupsHead.GroupTitle
    from JV_GroupsHead where JV_GroupsHead.Id=jv.GroupId) as 'GroupName'
,jv.Revenue --" This column i need to check and have to split it into two 
               column "credeit,debit""

from JVFunction1(@p_FromDate,@p_ToDate) as jv

END

Как написать оператор выбора таким образом, чтобы в нем использовался регистр, например сумма> = 0 в качестве кредита, а сумма <0 в качестве дебета?</p>

Ответы [ 3 ]

4 голосов
/ 21 сентября 2010

Изменить в соответствии с вашими потребностями

SELECT
   CASE WHEN Amount < 0 THEN ABS(Amount) ELSE NULL AS Debit,
   CASE WHEN Amount >= 0 THEN Amount ELSE NULL AS Credit
FROM
   SomeTable
1 голос
/ 21 сентября 2010

Вы имеете в виду, как это, отдельный столбец, чтобы указать тип суммы?

SELECT Amount, CASE WHEN Amount < 0 THEN 'Debit' ELSE 'Credit' END AS Type
FROM SomeTable
0 голосов
/ 21 сентября 2010

Я бы, вероятно, создал бы пользовательскую функцию, чтобы сделать это немного проще.

например.

create function dbo.CreditOrDebit (@amount decimal(9,2), @type char(6))
returns decimal(9,2)
as
begin
declare @output decimal(9,2);
select @output =
    case @type
    when 'debit' then
        case 
            when @amount < 0.00 then ABS(@amount) 
            else 0
        end
    else
        case 
            when @amount >= 0.00 then ABS(@amount) 
            else 0
        end
    end;
    return @output;
end

Затем используйте ее в своем операторе Select, например:

select jv.AccountNo,jv.AccountNoTitle,(select JV_GroupsHead.GroupTitle
    from JV_GroupsHead where JV_GroupsHead.Id=jv.GroupId) as 'GroupName'
,dbo.CreditOrDebit(jv.Revenue,'debit') as debit
,dbo.CreditOrDebit(jv.Revenue,'credit') as credit
...