2016-09-06 57 views
0

中指定的列我正在使用以下代码,并希望有从以前的CASE SUMs列Total_Bank_AmountProg_Variance SUMed。尝试SUM选择语句中创建的列与选择

SELECT 
    b.Date, 
    SUM(p.Prog_Amount) AS Prog_Amount, 
    SUM(o.Credit_Amt) AS Outstanding, 
    CASE 
     WHEN b.Bank_Name Like '%Corp%' 
      THEN SUM(b.Credit_Amt) 
    END AS TMP_Amount, 
    CASE 
     WHEN b.Bank_Name Like '%Cleo%' 
      THEN SUM(b.Credit_Amt) 
    END AS Cleo_Amount, 
    CASE 
     WHEN b.Bank_Name Like '%NY Bank%' 
      THEN SUM(b.Credit_Amt) 
    END AS NY_Amount, 
    CASE 
     WHEN b.Bank_Name Like '%MA%' 
      THEN SUM(b.Credit_Amt) 
    END AS MA_Amount, 
    CASE 
     WHEN b.Bank_Name Like '%CT%' 
      THEN SUM(b.Credit_Amt) 
    END AS CT_Amount, 
    CASE 
     WHEN b.Bank_Name Like '%NY_SS%' 
      THEN SUM(b.Credit_Amt) 
    END AS NY_SS_Amount, 
    CASE 
     WHEN b.Bank_Name LIKE '%VC_SS%' 
      THEN SUM(b.Credit_Amt) 
    END AS VC_SS_Amount, 
    (TMP_Amount + Cleo_Amount + NY_Amount + MA_Amount + CT_Amount + NY_SS_Amount + VC_SS_Amount) AS Total_Bank_Amount, 
    (Prog_Amount + Outstanding - TMP_Amount - Cleo_Amount - NY_Amount - MA_Amount - CT_Amount - NY_SS_Amount - VC_SS_Amount) AS Prog_Variance 
FROM 
    vw_Prog_Reference_Summary p 
RIGHT JOIN 
    Bank_Detail b ON p.Bank_Reference_Number = b.Bank_Reference 
LEFT JOIN 
    vw_Outstanding_Form o ON b.Bank_Reference = o.Bank_Reference 
LEFT JOIN 
    Exclusion e ON b.Bank_Reference = e.Exclude 
WHERE 
    e.Exclude IS NULL 
GROUP BY 
    b.Bank_Name, b.Date 

问题是这些不是由他们解析的时候创建的,所以你如何解决这个问题?有研究我想出什么=(感谢

回答

1

不幸的是,你不能在同一SELECT语句中引用列别名。通常这种情况的解决办法是让你的核心查询子查询,然后引用该列的别名或可重复同样的逻辑再次在计算(所以你会重复所有的那些案件和总结报表再次进行总计)。

下面链接,由于该参照已问过: Reference an alias elsewhere in the SELECT list

+0

@ Zi0n1This工作。由于某种原因,我仍然无法掌握它的原始链接,但我曾做过多看多看,并找到了相同类型的答案,只是稍微好一些,我猜:[link](http://stackoverflow.com/ question/11182339/reference-alias-calculated-in-select-in-where-clause) – KRM

0

尝试是这样的:。

SELECT 
    (TMP_Amount + Cleo_Amount + NY_Amount + MA_Amount + CT_Amount + NY_SS_Amount + VC_SS_Amount) AS Total_Bank_Amount, 
    (Prog_Amount + Outstanding - TMP_Amount - Cleo_Amount - NY_Amount - MA_Amount - CT_Amount - NY_SS_Amount - VC_SS_Amount) AS Prog_Variance 
FROM (
    SELECT b.Date, Sum(p.Prog_Amount) AS Prog_Amount, Sum(o.Credit_Amt) AS Outstanding, 
     CASE WHEN b.Bank_Name Like '%Corp%' THEN SUM(b.Credit_Amt) END AS TMP_Amount, 
     CASE WHEN b.Bank_Name Like '%Cleo%' THEN SUM(b.Credit_Amt) END AS Cleo_Amount, 
     CASE WHEN b.Bank_Name Like '%NY Bank%' THEN SUM(b.Credit_Amt)END AS NY_Amount, 
     CASE WHEN b.Bank_Name Like '%MA%' THEN SUM(b.Credit_Amt) END AS MA_Amount, 
     CASE WHEN b.Bank_Name Like '%CT%' THEN SUM(b.Credit_Amt) END AS CT_Amount, 
     CASE WHEN b.Bank_Name Like '%NY_SS%' THEN SUM(b.Credit_Amt)END AS NY_SS_Amount, 
     CASE WHEN b.Bank_Name Like '%VC_SS%' THEN SUM(b.Credit_Amt)END AS VC_SS_Amount 
    FROM vw_Prog_Reference_Summary p 
     RIGHT JOIN Bank_Detail b ON p.Bank_Reference_Number = b.Bank_Reference 
     LEFT JOIN vw_Outstanding_Form o ON b.Bank_Reference = o.Bank_Reference 
     LEFT JOIN Exclusion e ON b.Bank_Reference = e.Exclude 
    WHERE e.Exclude Is Null 
    GROUP BY b.Bank_Name, b.Date 
) t 

我搬到了旧的查询到一个子查询,这样你想要的值可我也感动了。总和为Total_Bank_AmountProg_Variance之外。

0

我认为你正在寻找有条件聚集:

SELECT b.Date, Sum(p.Prog_Amount) AS Prog_Amount, Sum(o.Credit_Amt) AS Outstanding, 
     SUM(CASE WHEN b.Bank_Name Like '%Corp%' THEN b.Credit_Amt END) AS TMP_Amount, 
     . . . 
FROM . . . 
GROUP BY b.Date; 

也就是说,你想要的CASE作为参数传递给SUM() ,而不是相反。

这假定(合理)您实际上并不想为每个银行单独一行,而只是汇总的信息。

+0

这也是我期待的一个好结果Sum整个案例。我也更新了我的代码。 – KRM

0

请阅读Rollup, Cube and Grouping Sets。这会给你在相同的选择(如果这是你想要的)的总和,但你将不得不考虑NULL值。

或者,你可以使用一个UNIONWITH这样的:

With SummaryData As 
(
    SELECT 
     b.Date, Sum(p.Prog_Amount) AS Prog_Amount, Sum(o.Credit_Amt) AS Outstanding, 
     CASE WHEN b.Bank_Name Like '%Corp%' THEN SUM(b.Credit_Amt) END AS TMP_Amount, 
     CASE WHEN b.Bank_Name Like '%Cleo%' THEN SUM(b.Credit_Amt) END AS Cleo_Amount, 
     CASE WHEN b.Bank_Name Like '%NY Bank%' THEN SUM(b.Credit_Amt)END AS NY_Amount, 
     CASE WHEN b.Bank_Name Like '%MA%' THEN SUM(b.Credit_Amt) END AS MA_Amount, 
     CASE WHEN b.Bank_Name Like '%CT%' THEN SUM(b.Credit_Amt) END AS CT_Amount, 
     CASE WHEN b.Bank_Name Like '%NY_SS%' THEN SUM(b.Credit_Amt)END AS NY_SS_Amount, 
     CASE WHEN b.Bank_Name Like '%VC_SS%' THEN SUM(b.Credit_Amt)END AS VC_SS_Amount, 
     (TMP_Amount + Cleo_Amount + NY_Amount + MA_Amount + CT_Amount + NY_SS_Amount + VC_SS_Amount) AS Total_Bank_Amount, 
     (Prog_Amount + Outstanding - TMP_Amount - Cleo_Amount - NY_Amount - MA_Amount - CT_Amount - NY_SS_Amount - VC_SS_Amount) AS Prog_Variance 
    FROM vw_Prog_Reference_Summary p 
    RIGHT JOIN Bank_Detail b 
     ON p.Bank_Reference_Number = b.Bank_Reference 
    LEFT JOIN vw_Outstanding_Form o 
     ON b.Bank_Reference = o.Bank_Reference 
    LEFT JOIN Exclusion e 
     ON b.Bank_Reference = e.Exclude 
    WHERE e.Exclude Is Null 
    GROUP BY b.Bank_Name, b.Date 
) 

Select * 
From SummaryData 

Union All 

SELECT 
    Date, 
    0 Prog_Amount, 
    0 Outstanding, 
    0 TMP_Amount, 
    0 Cleo_Amount, 
    0 NY_Amount, 
    0 MA_Amount, 
    0 CT_Amount, 
    0 NY_SS_Amount, 
    0 VC_SS_Amount, 
    Sum (Total_Bank_Amount) Total_Bank_Amount, 
    Sum (Prog_Variance) Prog_Variance 
FROM SummaryData 
Group By 
    Date 
+0

这给了我与当前脚本相同的问题。 Zi0n1具有正确的路线。 – KRM