2011-01-06 4 views
3

SELECT 문의 결과가 VIEW 내부 SELECT의 결과와 다릅니다. 문제를 수정하고 동일한 결과를보기에서 얻는 방법?SELECT와 다른 결과 및 내부에서보기

조치는 테이블 :

+--+---------+--------------+-----------+------+ 
|id|person_id|action_type_id|currency_id|sum | 
+--+---------+--------------+-----------+------+ 
|1 |1  |1    |1   | 1.00 | 
|2 |1  |1    |1   | 5.00 | 
|3 |1  |1    |2   |10.00 | 
|4 |1  |2    |1   | 2.00 | 
|5 |2  |1    |1   |20.00 | 
|6 |2  |2    |2   | 5.00 | 
+--+---------+--------------+-----------+------+ 

선택 :

SELECT person_id AS p, currency_id AS c, 
(
CAST(
COALESCE(
(SELECT SUM(sum) FROM actions WHERE action_type_id=1 AND person_id=p AND currency_id=c) 
, 0) 
AS DECIMAL(11,2)) - 
CAST(
COALESCE(
(SELECT SUM(sum) FROM actions WHERE action_type_id=2 AND person_id=p AND currency_id=c) 
, 0) 
AS DECIMAL(11,2)) 
) AS sum 
FROM actions 
GROUP BY currency_id, person_id 
ORDER BY person_id, currency_id; 

결과 :

CREATE VIEW p_sums AS 
SELECT person_id AS p, currency_id AS c, 
(
CAST(
COALESCE(
(SELECT SUM(sum) FROM actions WHERE action_type_id=1 AND person_id=p AND currency_id=c) 
, 0) 
AS DECIMAL(11,2)) - 
CAST(
COALESCE(
(SELECT SUM(sum) FROM actions WHERE action_type_id=2 AND person_id=p AND currency_id=c) 
, 0) 
AS DECIMAL(11,2)) 
) AS sum 
FROM actions 
GROUP BY currency_id, person_id 
ORDER BY person_id, currency_id; 

SELECT * FROM p_sums; 
,369 :

+--+--+------+ 
|p |c |sum | 
+--+--+------+ 
|1 |1 | 4.00 | 
|1 |2 |10.00 | 
|2 |1 |20.00 | 
|2 |2 |-5.00 | 
+--+--+------+ 

하는 내부보기를 선택

결과 :

+--+--+------+ 
|p |c |sum | 
+--+--+------+ 
|1 |1 |29.00 | 
|1 |2 |29.00 | 
|2 |1 |29.00 | 
|2 |2 |29.00 | 
+--+--+------+ 
+0

사용중인 mysql의 버전은 무엇입니까? – Jason

+1

초보자를위한 (나도 마찬가지였다.) 누군가가 솔루션을 제공하는 데 도움을 줄 때, 그것은 당신을 그루터기 너머로 데려다 줄 것이다. 즉, 대답에 따라 체크 박스를 클릭하여 다른 사람들이 솔루션이 이미 해결되었습니다. – DRapp

+0

나는 대답을 받아 들일 수 있기 전에 나는 그렇게했다. 그러나 그것은 내가 60 초 기다려야한다. – happytoad

답변

3

당신이 할 수 없습니다 :

SELECT person_id AS p, currency_id AS c, SUM(CASE action_Type_id WHEN 1 THEN sum WHEN 2 THEN -sum END) as sum 
FROM actions 
GROUP BY currency_id, person_id 
ORDER BY person_id, currency_id; 

즉, 서브 쿼리를 없애고 하나의 합계를 작성하십시오 (action_type_id 2 값을 음수로 지정)

+0

그것이 작동한다! 그리고 그것은 매우 우아하다. 대단히 감사합니다 !! – happytoad

관련 문제