代码之家  ›  专栏  ›  技术社区  ›  ImaginaryHuman072889

mysql创建摘要视图

  •  2
  • ImaginaryHuman072889  · 技术社区  · 6 年前

    我的情况的简化示例:

    我有两张表(一张是2017年的,一张是2018年的),有两列, Category Cost 是的。

    这两张桌子可以共用一些 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 |
    +------------------+-----------+-----------+
    

    我可以找出如何创建包含 类别 这在两个表之间是很常见的,但是我不知道如何也包括每个表所特有的那些表并填写 0.00 为了那些价值观。(我也可以填写 NULL 而不是 0.00分 如果更容易的话。)

    这就是我如何找出包含 类别 ,但这并不是我想要的:

    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 桌子?

    1 回复  |  直到 6 年前
        1
  •  2
  •   ScaisEdge    6 年前

    您应该为类别使用中间视图(对于某些mysql版本,视图中不允许使用subselect in),并为开销使用一对left join

      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  
      ;