MYSQL创建摘要视图

时间:2018-07-01 19:11:49

标签: mysql view

我的情况的简化示例:

我有两个表(一个表用于2017,一个表用于2018),其中有两列CategoryCost

两个表可能共享一些Categories,但它们每个表也可能具有一些唯一的表。

我正在尝试创建一个“主”视图,其中包含两个表之间所有类别的列表。

例如这就是我所拥有的

Table: 2017_Summary
+------------------+----------+
| Category         | Cost     |
+------------------+----------+
| Home Improvement | -1000.00 |
| Mortgage         |  -800.00 |
| Groceries        |  -500.00 |
| Bills            |  -400.00 |
| Taxes            |  -300.00 |
+------------------+----------+

Table: 2018_Summary
+------------------+----------+
| Category         | Cost     |
+------------------+----------+
| Mortgage         |  -750.00 |
| Groceries        |  -550.00 |
| Bills            |  -400.00 |
| Car Payment      |  -350.00 |
| Taxes            |  -300.00 |
+------------------+----------+

这就是我想要的:

View: Summary
+------------------+-----------+-----------+
| Category         | 2017_Cost | 2018_Cost |
+------------------+-----------+-----------+
| Home Improvement |  -1000.00 |      0.00 |
| Mortgage         |   -800.00 |   -750.00 |
| Groceries        |   -500.00 |   -550.00 |
| Bills            |   -400.00 |   -400.00 |
| Car Payment      |      0.00 |   -350.00 |
| Taxes            |   -300.00 |   -300.00 |
+------------------+-----------+-----------+

我可以弄清楚如何创建包含两个表之间的Categories的视图,但是我不能弄清楚如何也包括每个表所独有的视图并填写{ {1}}输入这些值。 (如果方便的话,我也可以填写0.00而不是NULL。)

这就是我找出包含公用0.00的视图的方式,但这并不是我想要的:

Categories

最后一个问题:如果使用两个以上的表(例如,还与CREATE VIEW SUMMARY (CATEGORY,2017_COST,2018_COST) AS SELECT A.CATEGORY,A.COST,B.COST FROM 2017_SUMMARY A, 2018_SUMMARY B WHERE A.CATEGORY = B.CATEGORY; 表结合使用),该视图会变得更加复杂吗?

1 个答案:

答案 0 :(得分:2)

对于类别,您应该使用中间视图(某些mysql版本的视图中不允许使用subselect),对于成本,请使用一对左连接

  CREATE VIEW all_category  AS
  select category 
  from 2018_Summary
  union 
  select category 
  from 2017_Summary
  ;

  CREATE VIEW SUMMARY AS 
  select a.category, ifnull(b.cost,0) as 2017_cost, ifnull(c.cost, 0)as 2018_cost
  from all_category a
  left join 2017_Summary b on a.category = b.category 
  left join 2018_Summary c on a.category = c.category  
  ;