Могу ли я использовать если заявление в MySQL? - PullRequest
1 голос
/ 30 сентября 2019

Я пытаюсь создать запрос, который будет генерировать их общее использование, которое зависит от цен. Я не знаю, возможно ли это в простом запросе, поэтому вот оно.

Основная таблица // Эта таблица для всех людей, так что это непрерывно, это можно добавить, столбец IDуникальный.

 id          price       date_created
 25           8.5         2019-08-16
 26           11.5        2019-08-01

таблица электричества // Эта таблица является непрерывной базой для main_id, пока 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_id в Main table.

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, я действительно застрял с этой проблемой. Я думаю, что использовать оператор IF здесь, в MYSQL, или это просто сложно сделать в Query?

1 Ответ

1 голос
/ 01 октября 2019

SQL DEMO

Сначала вам нужно собрать все цены вместе:

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 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...