Sql 如何将正列移到另一列中?

Sql 如何将正列移到另一列中?,sql,tsql,case-when,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.

我必须将正值和负值分离到不同的列中,我知道我可以通过使用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'

如果要使用自建列TBAmt,则需要将其作为子查询编写


如果要使用自建列TBAmt,则需要将其作为子查询编写


SQL Server允许您使用横向联接声明此类表达式,即应用:


您还应该使用有意义的表别名,而不是任意字母,如A和B。

SQL Server允许您使用横向联接声明此类表达式,即应用:


您还应该使用有意义的表别名,而不是像A和B这样的任意字母。

为什么我不能在一条语句中使用它?无论如何,谢谢你不能在同一个select语句中使用你自己构造的列,你必须使用子查询,为什么我不能在一个语句中创建它?无论如何,感谢您不能使用在同一select语句中自己构造的列,您必须使用子查询,
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
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';