1

我有以下 SQL 语句:

SELECT id  + 100000000000000000 AS id,  
    a.external_code + CAST(id AS varchar(15)) as crUniqueId,  
    m.check_amount,  
    'C' as crType,  
    m.postprint_date as activationDate,  
    m.postprint_date as creationDate,  
    m.memo_explanation as reasonLine1,  
    m.check_no, 
    m.check_amount - sh.sumAmount As dispositionAmount 
    FROM md_master m 
    Join accounts a on m.account_tag = a.acct_id 
    LEFT JOIN (SELECT master_id,  
                SUM(md_cr_pending.current_amount) as sumAmount  
                FROM md_cr_pending 
                Group BY master_id) sh ON master_id = m.ID 
    WHERE (m.postprint_tag = 2) OR (m.postprint_tag = 4) OR  
          (m.postprint_tag = 5) OR (m.postprint_tag = 7) 

    UNION ALL  

    SELECT id + 200000000000000000 as id,  
    'PERCHK' + CAST(id AS varchar(15)) as crUniqueId,  
    check_amount,  
    'P' as crType,  
    business_date as activationDate,  
    business_date as creationDate,  
    identify_description as reasonLine1,  
    check_no, 
    check_amount - sh.sumAmount As dispositionAmount 
    FROM cd_personal_checks  
    LEFT JOIN (SELECT cd_personal_checks_id,  
                SUM(md_cr_pending.current_amount) as sumAmount  
                FROM md_cr_pending 
                Group BY  cd_personal_checks_id) sh  
                ON sh.cd_personal_checks_id = cd_personal_checks.ID

我想在 UNION 的每个 select 语句中添加一个附加列。但是,我需要使用作为上一列创建的别名。

例如。我想做以下事情

m.check_amount - sh.sumAmount As dispositionAmount, m.check_amount-dispositionAmount AS openBalance

check_amount - sh.sumAmount As dispositionAmount,  check_amount-dispositionAmount AS openBalance

分别

这可以做到吗?目前,按照我上面的做法,我得到一个“无效的列名'dispositionAmount'”

谢谢

4

4 回答 4

2

不,它不能处于同一级别,因为您在选择中给出的别名仅在 Order By 部分中“可用”。这是因为逻辑查询处理。

为此,您应该构建更多级别,或再次使用该表达式。

我不知道,你想这样做:

m.check_amount - sh.sumAmount As dispositionAmount, 
m.check_amount - dispositionAmount AS openBalance

因为它是相等的:

m.check_amount - sh.sumAmount As dispositionAmount, 
m.check_amount - m.check_amount + sh.sumAmountAS AS openBalance

这是:

m.check_amount - sh.sumAmount As dispositionAmount, 
sh.sumAmountAS AS openBalance
于 2012-09-07T15:22:43.787 回答
0

不,这做不到。您需要重复计算dispositonAmount.

...
m.check_amount - sh.sumAmount As dispositionAmount, 
m.check_amount - (m.check_amount - sh.sumAmount) AS openBalance
...
于 2012-09-07T15:24:24.087 回答
0

表达式check_amount-dispositionAmount与 相同check_amount-(check_amount - sh.sumAmount),与 相同(check_amount-check_amount) + sh.sumAmount,所以就是sh.sumAmount

所以:

check_amount - sh.sumAmount As dispositionAmount, sh.sumAmount AS openBalance
于 2012-09-07T15:26:22.103 回答
0

您可以使用 CROSS APPLY CROSS APPLY

SELECT my_num, my_num*5 AS another_number FROM table CROSS APPLY (SELECT 5 AS my_num) X
于 2016-08-30T20:16:59.707 回答