MySQL中的视图基于多个计算值

时间:2009-07-12 21:20:29

标签: mysql

在前一个问题的后续内容中,假设我有3个表,A,B和C.表A有一个ID,用作表B和C上的外键,每个表都有一些值作为属性。对于表A中的每个ID,我想得到表B和C之间的值差异,可以按如下方式进行:

CREATE VIEW T1 AS
    SELECT B.A_ID AS ID, SUM(B.VALUE) AS VAL
    FROM B
    GROUP BY B.A_ID;
CREATE VIEW T2 AS
    SELECT C.A_ID AS ID, SUM(C.VALUE) AS VAL
    FROM C
    GROUP BY C.A_ID;
SELECT T1.ID, T1.VAL, T2.VAL FROM T1, T2 WHERE T1.ID = T2.ID;

问题是,如果表B具有特定ID的某些值,但表C没有,反之亦然。在这种情况下,我的select语句不会返回该行。有没有办法让我创建一个单独的视图,基本上如下所示:

CREATE VIEW T3 AS
    SELECT B.A_ID AS ID, SUM(B.VALUE) AS VAL1, SUB(C.VAL) AS VAL2
    FROM B, C
    WHERE B.A_ID = C.A_ID
    GROUP BY B.A_ID;

此类视图的创建脚本示例将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以使用此

CREATE VIEW myView AS
SELECT test_a.id, name, IFNULL( (
  SELECT SUM( value ) 
  FROM test_b
  WHERE test_b.a_id = test_a.id
  GROUP BY test_b.a_id ) , 0
) - IFNULL( (
  SELECT SUM( value ) 
  FROM test_c
  WHERE test_c.a_id = test_a.id
  GROUP BY test_c.a_id ) , 0
)
FROM test_a

但如果c的总和高于b,这将导致负数。如果你想要绝对差异,请使用:

CREATE VIEW myView AS
SELECT test_a.id, name, ABS( IFNULL( (
  SELECT SUM( value ) 
  FROM test_b
  WHERE test_b.a_id = test_a.id
  GROUP BY test_b.a_id ) , 0 ) - IFNULL( (
SELECT SUM( value ) 
  FROM test_c
  WHERE test_c.a_id = test_a.id
  GROUP BY test_c.a_id ) , 0
  )
)
FROM test_a

答案 1 :(得分:0)

SELECT ID, MAX(VAL1), MAX(VAL2) FROM 
((SELECT B.A_ID AS ID, SUM(B.VALUE) AS VAL1, 0 as VAL2
FROM B GROUP BY B.A_ID) as T1
UNION
(SELECT C.A_ID AS ID, 0 VAL1, SUM(C.VALUE) AS VAL2
FROM C GROUP BY C.A_ID) as T2) as Foo
GROUP BY FOO.ID

它有点hacky。另外,您无法创建具有联合的视图。