我正在尝试创建一个查询,该查询将生成其使用总量(取决于价格)。我不知道在查询中是否可行,所以在这里。
主表//此表适用于所有人员,因此这是连续的,可以添加,ID列是唯一的。
id price date_created
25 8.5 2019-08-16
26 11.5 2019-08-01
电表//此表是基于main_id的连续表,只要该Main table
表每天都有usage
表存在main_id,存在于主表中。就像日常使用的电力一样。
id main_id current_usage date_generated
1 25 10 2019-08-16
2 25 10 2019-08-17
3 25 10 2019-08-18
4 25 10 2019-08-19
5 25 10 2019-08-20
6 25 10 2019-08-21
7 26 20 2019-08-01
8 26 5 2019-08-02
9 26 5 2019-08-03
10 26 10 2019-08-04
我的查询
SELECT main.id
, main.price
, SUM(electricity.current_usage)*main.price total_generated
, electricity.date_generated
FROM main AS main
INNER JOIN electricity AS electricity
ON main.id = electricity.main_id
GROUP
BY MONTH(electricity.date_generated);
在这里我没有问题,因为我要到达这里只是一个就是一个。
所以输出将是
id price total_genereated
25 8.5 510
26 11.5 460
这是我的问题所在,这是我卡住的地方
有一个price_history
表,该表的目的是,价格可以随时更改Main table
中该main_id。
id main_id changed_price price_date_changed
1 25 15 2019-08-18
2 26 20 2019-08-03
而不是仅获得两行。由于价格历史记录,我需要在这里显示4行。价格已经改变。
样本输出
id price total_genereated date_range
25 8.5 170 2019-08-16 - 2019-08-17
25 15 600 2019-08-18 - 2019-08-21
26 11.5 287 2019-08-01 - 2019-08-02
26 20 300 2019-08-03 - 2019-08-04
我不知道我的想法是否真的可能,仅通过在Query上执行就可以了,我真的陷入了这个问题。我在想的是在MYSQL中使用IF语句,还是在Query中做复杂的事情?
答案 0 :(得分:1)
首先,您需要将所有价格汇总在一起:
SELECT id as main_id, price, date_created
FROM main
UNION
SELECT main_id, changed_price, price_date_changed
FROM price_history
ORDER BY main_id, date_created;
输出
| main_id | price | date_created |
|---------|-------|--------------|
| 25 | 9 | 2019-08-16 |
| 25 | 15 | 2019-08-18 |
| 26 | 12 | 2019-08-01 |
| 26 | 20 | 2019-08-03 |
现在使用相关子查询查找最新价格:
SELECT id, main_id, current_usage, date_generated,
( SELECT price
FROM ( SELECT id as main_id, price, date_created
FROM main
UNION
SELECT main_id, changed_price, price_date_changed
FROM price_history
) prices
WHERE prices.main_id = electricity.main_id
AND prices.date_created <= electricity.date_generated
ORDER BY prices.date_created DESC
LIMIT 1 ) as price
FROM electricity
ORDER BY main_id, date_generated;
输出
| id | main_id | current_usage | date_generated | price |
|----|---------|---------------|----------------|-------|
| 1 | 25 | 10 | 2019-08-16 | 9 |
| 2 | 25 | 10 | 2019-08-17 | 9 |
| 3 | 25 | 10 | 2019-08-18 | 15 |
| 4 | 25 | 10 | 2019-08-19 | 15 |
| 5 | 25 | 10 | 2019-08-20 | 15 |
| 6 | 25 | 10 | 2019-08-21 | 15 |
| 7 | 26 | 20 | 2019-08-01 | 12 |
| 8 | 26 | 5 | 2019-08-02 | 12 |
| 9 | 26 | 5 | 2019-08-03 | 20 |
| 10 | 26 | 10 | 2019-08-04 | 20 |