【问题标题】:different result from SELECT and from SELECT inside a VIEWSELECT 和 VIEW 中的 SELECT 结果不同
【发布时间】:2011-06-04 15:42:58
【问题描述】:

SELECT 语句的结果与 VIEW 中的 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 |
+--+--+------+

【问题讨论】:

  • 你用的是什么版本的mysql?
  • 仅供参考,对于新手(我也是一个),当有人帮助提供解决方案时,它可以让您超越您的树桩,请点击他们回答下方的复选框给予他们信任,以便其他人知道解决方案已经解决。
  • 我这样做了,但是我要等 60 秒才能接受答案:)

标签: sql mysql sql-view


【解决方案1】:

你可以不做吗:

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 值为负)

【讨论】:

  • 它有效!它非常优雅。非常非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 2018-07-30
  • 2011-03-22
  • 2014-07-10
相关资源
最近更新 更多