2013-01-18 121 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