如何将正栏移到另一栏?

时间:2019-07-16 07:40:17

标签: sql tsql case-when

我必须将正值和负值分离到不同的列中,我知道我可以使用CASE WHEN语句来实现这一点,但结果却显示错误“无效的列名TBAmt”。 以下是我的SQL代码,有人可以建议吗?谢谢

SELECT 
B.ACCTFMTTD, B.ACCTDESC, A.FSCSYR, A.CURNTYPE, (A.OPENBAL + A.NETPERD1 + A.NETPERD2 + A.NETPERD3 + A.NETPERD4 + A.NETPERD5 + A.NETPERD6 + A.NETPERD7 + A.NETPERD8 + A.NETPERD9 + A.NETPERD10 + A.NETPERD11 + A.NETPERD12 + A.NETPERD13 + A.NETPERD14) AS TBAmt,

CASE WHEN [TBAmt] > 0 THEN [TBAmt] ELSE 0 END AS Debit,
CASE WHEN [TBAmt] < 0 THEN [TBAmt] ELSE 0 END AS Credit

FROM GLAFS AS A LEFT JOIN GLAMF AS B ON A.ACCTID = B.ACCTID
where 
A.FSCSYR = '2018' AND A.CURNTYPE = 'F'

2 个答案:

答案 0 :(得分:2)

如果要使用自构造列TBAmt

,则需要将其作为子查询编写
SELECT
   CASE WHEN [TBAmt] > 0 THEN [TBAmt] ELSE 0 END AS Debit,
   CASE WHEN [TBAmt] < 0 THEN [TBAmt] ELSE 0 END AS Credit
FROM
(
   SELECT 
      B.ACCTFMTTD, B.ACCTDESC, A.FSCSYR, A.CURNTYPE, (A.OPENBAL + A.NETPERD1 + A.NETPERD2 + A.NETPERD3 + A.NETPERD4 + A.NETPERD5 + A.NETPERD6 + A.NETPERD7 + A.NETPERD8 + A.NETPERD9 + A.NETPERD10 + A.NETPERD11 + A.NETPERD12 + A.NETPERD13 + A.NETPERD14) AS TBAmt

   FROM GLAFS AS A LEFT JOIN GLAMF AS B ON A.ACCTID = B.ACCTID
   where 
      A.FSCSYR = '2018' AND A.CURNTYPE = 'F'
) tbl

答案 1 :(得分:0)

SQL Server允许您使用横向联接(即apply)来声明此类表达式:

SELECT AM.ACCTFMTTD, AM.ACCTDESC,
       AF.FSCSYR, AF.CURNTYPE, V.TBAmt,
       (CASE WHEN V.TBAmt > 0 THEN TBAmt ELSE 0 END) AS Debit,
       (CASE WHEN V.TBAmt < 0 THEN TBAmt ELSE 0 END) AS Credit
FROM GLAFS AF LEFT JOIN
     GLAMF AM
     ON AF.ACCTID = AM.ACCTID CROSS APPLY
     (VALUES (AF.OPENBAL + AF.NETPERD1 + AF.NETPERD2 + AF.NETPERD3 + AF.NETPERD4 + AF.NETPERD5 + AF.NETPERD6 + AF.NETPERD7 + AF.NETPERD8 + AF.NETPERD9 + AF.NETPERD10 + AF.NETPERD11 + AF.NETPERD12 + AF.NETPERD13 + AF.NETPERD14)
     ) V(v.TBAmt)
WHERE AF.FSCSYR = '2018' AND AF.CURNTYPE = 'F';

您还应该使用有意义的表别名,而不要使用诸如AB之类的任意字母。