mysql - MYSQL 创建摘要视图
问题描述
我的情况的简化示例:
我有两张表(一张用于 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 |
+------------------+-----------+-----------+
我可以弄清楚如何创建包含Categories
两个表之间共有的视图的视图,但我不知道如何还包括每个表独有的视图并填写0.00
这些值。(我也可以填写NULL
而不是0.00
更容易。)
这就是我找出包含 common 的视图的方法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 版本,不允许在视图中使用子选择)和一对左连接的成本
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
;
推荐阅读
- c# - 如何添加包含 Grid、StackPanel 和 TextBlock 的 ListViewItem
- javascript - 为什么我的代码返回“无法读取未定义的属性''”?
- python-3.x - AtributeError:模块“pytube”没有属性“YouTube”
- nativescript - 单例类不适用于组件导航
- html - 将自定义 CSS 添加到 Wordpress 仪表板
- java - 将文件上传到 blob 容器似乎会泄漏通道
- postgresql - 使用 PostgreSQL 时单元测试产生不同的结果
- c++ - 为什么 C++ 允许前向声明类而不是枚举?
- android - Android 应用选择性地显示谷歌地图
- git - git 由于 --skip-worktree 更改而阻止结帐