2011-01-06 18 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; 

結果:

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

を内部ビューを選択:

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; 

結果:

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

使用しているmysqlのバージョンは? – Jason

+1

初心者の方(私も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

関連する問題