2013-01-18 122 views
2

我有以下查詢。我想從SUM中減去數字,然後只返回結果不爲0的數字。任何幫助將不勝感激。我也有興趣看看這是否可以在一個查詢中完成。我用HAVING子句試了一下,但是它返回錯誤的結果。使用SQL Server 2008減去兩個子查詢

SELECT 
(
SELECT station_id, SUM(tcl_missing + tcl_not_missing) as tcl_total 
FROM tcl_missing_summary 
GROUP BY station_id 
) as a 

(
SELECT station_id, SUM(total) as total 
FROM tcl_breakdown_op 
WHERE tr_standard not like '%cru' 
GROUP BY station_id 
) as b 
WHERE a.tcl_total - total <> 0 

回答

2

假設你有一個以上的stationID,

SELECT station_id, tcl_total, total, a.tcl_total - total as diff 
from (
SELECT station_id, SUM(tcl_missing + tcl_not_missing) AS tcl_total 
FROM tcl_missing_summary 
GROUP BY station_id 
) AS a INNER JOIN 

(
SELECT station_id, SUM(total) AS total 
FROM tcl_breakdown_op 
WHERE tr_standard NOT LIKE '%cru' 
GROUP BY station_id 
) AS b 
ON a.stationid = b.stationid 
WHERE a.tcl_total - total <> 0 

也考慮像

SELECT 
    station_id, 
    SUM(tcl_missing + tcl_not_missing) AS sum_tcl_total, 
    SUM(total) AS sum_total, 
    SUM(tcl_missing + tcl_not_missing) - SUM(total) AS diff 
FROM 
    tcl_missing_summary s INNER JOIN 
    tcl_breakdown_op b ON 
    s.station_id = b.station_id 
WHERE 
    tr_standard NOT LIKE '%cru'  
GROUP BY 
    station_id 
HAVING 
    SUM(tcl_missing + tcl_not_missing) <> SUM(total) 
+0

謝謝,第一個作品。我會嘗試第二個 – dido

0

試試這個

; WITH CTE1 AS 
(
SELECT station_id, SUM(tcl_missing + tcl_not_missing) as tcl_total 
FROM tcl_missing_summary 
GROUP BY station_id 
), CTE2 AS 
(
SELECT station_id, SUM(total) as total 
FROM tcl_breakdown_op 
WHERE tr_standard not like '%cru' 
GROUP BY station_id 
) 

SELECT * FROM CTE1 a 
LEFT OUTER JOIN CTE2 b ON a.station_id = b.station_id 
WHERE a.tcl_total - isnull(b.total,0) <> 0 
0
SELECT a.station_id AS station, a.tcl_total-b.total AS difference 
(
SELECT station_id, SUM(tcl_missing + tcl_not_missing) as tcl_total 
FROM tcl_missing_summary 
GROUP BY station_id 
) as a 
INNER JOIN 
(
SELECT station_id, SUM(total) as total 
FROM tcl_breakdown_op 
WHERE tr_standard not like '%cru' 
GROUP BY station_id 
) as b ON a.station_id = b.station_id 
WHERE a.tcl_total - b.total <> 0 

這也可以轉換爲外連接,如果你知道一個結果集可能沒有數據站的某個子集。

0

我同意在CTE方法的rs作爲嵌套選擇恕我直言得到討厭後,其中兩三個。 CTE也會按照邏輯分組顯示您的數據。

不過,如果你必須使用嵌套的選擇,只需添加幾行代碼,使之完成:

SELECT a.tcl_total 
from 
(
SELECT station_id, SUM(tcl_missing + tcl_not_missing) as tcl_total 
FROM tcl_missing_summary 
GROUP BY station_id 
) as a 
, 
(
SELECT station_id, SUM(total) as total 
FROM tcl_breakdown_op 
WHERE tr_standard not like '%cru' 
GROUP BY station_id 
) as b 
WHERE a.tcl_total - b.total <> 0