2016-08-31 3 views
0

私は次のコードでエラー無効な列名を取得していますから値を減算する方法:追加し、前の文

SELECT 
    DS, AccNumber, PPeriod, 
    MAX(CASE WHEN LinkAcc = '1010000' THEN amount END) AS Opening, 
    MAX(CASE WHEN LinkAcc = '1010000' THEN amount END) AS electricity, 
    MAX(CASE WHEN LinkAcc = '1045000' THEN amount END) AS water, 
    MAX(CASE WHEN LinkAcc = '1000000' THEN amount END) AS levy, 
    MAX(CASE WHEN LinkAcc = '2750000' THEN amount END) AS Interest, 
    MAX(CASE WHEN LinkAcc = '4000000' THEN amount END) AS Legal, 
    MAX(CASE WHEN LinkAcc = '1020000' THEN amount END) AS Sewer, 
    SUM(CASE WHEN LinkAcc IN ('4350003','3850000','9250000') THEN amount END) As Other, 
    SUM(CASE WHEN LinkAcc IN ('8420000','8400000') AND amount < 0 THEN amount END) As Payments, 
    (Opening + electricity + water + levy + Interest + Legal + Sewer + Other - Payments) AS Due 
FROM 
    dbo.Table1 
WHERE 
    (AccNumber BETWEEN 'CC001' AND 'CC100') 
GROUP BY 
    DataSource, AccNumber, PPeriod 
HAVING 
    (DataSource = 'PAS11CEDCRE16') AND (PPeriod = 112) 

は、私が上記の加算と減算をやろうとしていると私は、無効な列名を取得し、I列名の前にテーブル名を入れようとしましたが、それでも失敗しました。

+0

どの列が問題だと思いますか?あなたのテーブルはどのように見えますか?単純なタイプミスかもしれない – CodyMR

答えて

2

現在のクエリを派生テーブルとして使用するか、CTEを使用します。

派生テーブル:

SELECT *, 
     (Opening + electricity + water + levy + Interest + Legal + Sewer + Other - Payments) AS Due 
FROM ( SELECT DS, AccNumber, PPeriod, 
     MAX(CASE WHEN LinkAcc = '1010000' THEN amount END) AS Opening, 
     MAX(CASE WHEN LinkAcc = '1010000' THEN amount END) AS electricity, 
     MAX(CASE WHEN LinkAcc = '1045000' THEN amount END) AS water, 
     MAX(CASE WHEN LinkAcc = '1000000' THEN amount END) AS levy, 
     MAX(CASE WHEN LinkAcc = '2750000' THEN amount END) AS Interest, 
     MAX(CASE WHEN LinkAcc = '4000000' THEN amount END) AS Legal, 
     MAX(CASE WHEN LinkAcc = '1020000' THEN amount END) AS Sewer, 
     SUM(CASE WHEN LinkAcc IN ('4350003','3850000','9250000') THEN amount END) As Other, 
     SUM(CASE WHEN LinkAcc IN ('8420000','8400000') AND amount < 0 THEN amount END) As Payments, 
     FROM dbo.Table1 
     WHERE (AccNumber BETWEEN 'CC001' AND 'CC100') 
     GROUP BY DataSource, AccNumber, PPeriod 
     HAVING (DataSource = 'PAS11CEDCRE16') AND (PPeriod = 112)) AS T; 

CTE:

WITH CTE AS 
(
    SELECT DS, AccNumber, PPeriod, 
    MAX(CASE WHEN LinkAcc = '1010000' THEN amount END) AS Opening, 
    MAX(CASE WHEN LinkAcc = '1010000' THEN amount END) AS electricity, 
    MAX(CASE WHEN LinkAcc = '1045000' THEN amount END) AS water, 
    MAX(CASE WHEN LinkAcc = '1000000' THEN amount END) AS levy, 
    MAX(CASE WHEN LinkAcc = '2750000' THEN amount END) AS Interest, 
    MAX(CASE WHEN LinkAcc = '4000000' THEN amount END) AS Legal, 
    MAX(CASE WHEN LinkAcc = '1020000' THEN amount END) AS Sewer, 
    SUM(CASE WHEN LinkAcc IN ('4350003','3850000','9250000') THEN amount END) As Other, 
    SUM(CASE WHEN LinkAcc IN ('8420000','8400000') AND amount < 0 THEN amount END) As Payments, 
    FROM dbo.Table1 
    WHERE (AccNumber BETWEEN 'CC001' AND 'CC100') 
    GROUP BY DataSource, AccNumber, PPeriod 
    HAVING (DataSource = 'PAS11CEDCRE16') AND (PPeriod = 112) 
) 
SELECT *, 
     (Opening + electricity + water + levy + Interest + Legal + Sewer + Other - Payments) AS Due 
FROM CTE; 
0

CTEを使用して

;WITH CTE AS (SELECT DS, AccNumber, PPeriod, 
MAX(CASE WHEN LinkAcc = '1010000' THEN amount END) AS Opening, 
MAX(CASE WHEN LinkAcc = '1010000' THEN amount END) AS electricity, 
MAX(CASE WHEN LinkAcc = '1045000' THEN amount END) AS water, 
MAX(CASE WHEN LinkAcc = '1000000' THEN amount END) AS levy, 
MAX(CASE WHEN LinkAcc = '2750000' THEN amount END) AS Interest, 
MAX(CASE WHEN LinkAcc = '4000000' THEN amount END) AS Legal, 
MAX(CASE WHEN LinkAcc = '1020000' THEN amount END) AS Sewer, 
SUM(CASE WHEN LinkAcc IN ('4350003','3850000','9250000') THEN amount END) As Other, 
SUM(CASE WHEN LinkAcc IN ('8420000','8400000') AND amount < 0 THEN amount END) As Payments 

FROM dbo.Table1 
WHERE (AccNumber BETWEEN 'CC001' AND 'CC100') 
GROUP BY DataSource, AccNumber, PPeriod, 

HAVING (DataSource = 'PAS11CEDCRE16') AND (PPeriod = 112)) 

Select 
*, 
(Opening + electricity + water + levy + Interest + Legal + Sewer + Other - Payments) AS Due 
FROM 
    CTE 

OR

派生テーブル:

Select T.*, 
(Opening + electricity + water + levy + Interest + Legal + Sewer + Other - Payments) AS Due from (
SELECT DS, AccNumber, PPeriod, 
MAX(CASE WHEN LinkAcc = '1010000' THEN amount END) AS Opening, 
MAX(CASE WHEN LinkAcc = '1010000' THEN amount END) AS electricity, 
MAX(CASE WHEN LinkAcc = '1045000' THEN amount END) AS water, 
MAX(CASE WHEN LinkAcc = '1000000' THEN amount END) AS levy, 
MAX(CASE WHEN LinkAcc = '2750000' THEN amount END) AS Interest, 
MAX(CASE WHEN LinkAcc = '4000000' THEN amount END) AS Legal, 
MAX(CASE WHEN LinkAcc = '1020000' THEN amount END) AS Sewer, 
SUM(CASE WHEN LinkAcc IN ('4350003','3850000','9250000') THEN amount END) As Other, 
SUM(CASE WHEN LinkAcc IN ('8420000','8400000') AND amount < 0 THEN amount END) As Payments 

FROM dbo.Table1 
WHERE (AccNumber BETWEEN 'CC001' AND 'CC100') 
GROUP BY DataSource, AccNumber, PPeriod, 

HAVING (DataSource = 'PAS11CEDCRE16') AND (PPeriod = 112))T 
0

外部SELECTを使用してクエリをラップします。別名を導入して同じSELECT句で使用することはできません。

SELECT Opening, 
    electricity, 
    water, 
    levy, 
    Interest, 
    Legal, 
    Sewer, 
    Other, 
    Payments, 
    (Opening + electricity + water + levy + Interest + Legal + Sewer + Other - Payments) AS Due 
FROM (
-- original query here 
) q 
関連する問題