【问题标题】:MYSQL Create Summary ViewMYSQL 创建摘要视图
【发布时间】:2018-07-01 19:11:48
【问题描述】:

我的情况的简化示例:

我有两张表(一张用于 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 的视图,但我不知道如何还包括每个表独有的视图并填写 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;

最后一个问题:如果使用两个以上的表(例如,还与2016_Summary 表结合),这个视图会变得更加复杂吗?

【问题讨论】:

    标签: mysql view


    【解决方案1】:

    您应该为类别使用中间视图(在某些 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  
      ; 
    

    【讨论】:

    • 谢谢,这行得通,实际上有没有办法将0 放在占位符中而不是NULL?起初我认为这无关紧要,但是当您按升序排序时,它会将NULLS 放在顶部,但我希望它们位于底部。
    猜你喜欢
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2017-06-20
    • 2020-04-25
    相关资源
    最近更新 更多