【问题标题】:Using case in a sql select statement在 sql 选择语句中使用大小写
【发布时间】:2010-09-21 09:59:43
【问题描述】:

考虑一个具有列数量的表,

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作为贷方,金额

【问题讨论】:

    标签: sql-server-2005 select case


    【解决方案1】:

    根据您的确切需要进行修改

    SELECT
       CASE WHEN Amount < 0 THEN ABS(Amount) ELSE NULL AS Debit,
       CASE WHEN Amount >= 0 THEN Amount ELSE NULL AS Credit
    FROM
       SomeTable
    

    【讨论】:

      【解决方案2】:

      你的意思是这样,一个单独的列来指示金额的类型吗?

      SELECT Amount, CASE WHEN Amount < 0 THEN 'Debit' ELSE 'Credit' END AS Type
      FROM SomeTable
      

      【讨论】:

      • 不是金额的类型,Amount 列应该显示为两个不同的借方和贷方列
      • @Pandiya:也许您可以更新您的问题以实际显示您想要的输出?
      • @Pandiya - 好吧。查看 gbn 的答案 - 就可以了
      【解决方案3】:

      我可能会创建一个用户定义的函数来简化此操作。

      例如。

      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
      

      【讨论】:

      • 标量 UDF 有一些开销。这将比内联 CASE 在更大的记录集上慢很多。
      • 我知道如果 UDF 包含 DML 就会出现这种情况,但是当 UDF 只是像这样进行一些求和时,我从未注意到任何区别。知道为什么它应该更慢吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 2012-05-05
      • 1970-01-01
      相关资源
      最近更新 更多