MYSQL: отображение одного запроса из оператора выбора из двух не связанных таблиц - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь отобразить сумму ежемесячного дохода из разных несвязанных таблиц, где я отображаю бюджет по фактическому использованию

У меня есть две таблицы Плановый бюджет и фактический бюджет, с похожими столбцами, но разнымиВ запросе я хочу получить сумму бюджета и сгруппировать ее по годам и месяцам.

Таблица планового бюджета

+-----+-------+-------------+-------------+
| uid | codes | opca_budget | date_period |
+-----+-------+-------------+-------------+
|  10 | 3210  | 3000        | 2018-03-01  |
|  17 | 3355  | 3000        | 2018-03-01  |
|  33 | 3210  | 4000        | 2018-04-01  |
|  40 | 3355  | 4000        | 2018-04-01  |
|  56 | 3210  | 5000        | 2018-05-01  |
|  63 | 3355  | 5000        | 2018-05-01  |
|  79 | 3210  | 6000        | 2018-06-01  |
|  86 | 3355  | 6000        | 2018-06-01  |
| 109 | 3355  | 45000       | 2018-07-01  |

Фактический бюджет

+-----+-------+-------------+---------------------+
| uid | codes | opca_budget | date_period         |
+-----+-------+-------------+---------------------+
|  10 | 3210  | 6500        | 2018-03-01 00:00:00 |
|  17 | 3355  | 6500        | 2018-03-01 00:00:00 |
|  18 | 3120  | 6500        | 2018-03-01 00:00:00 |
|  33 | 3210  | 7500        | 2018-04-01 00:00:00 |
|  40 | 3355  | 7500        | 2018-04-01 00:00:00 |
|  41 | 3120  | 7500        | 2018-04-01 00:00:00 |
|  56 | 3210  | 8500        | 2018-05-01 00:00:00 |
|  63 | 3355  | 8500        | 2018-05-01 00:00:00 |
|  64 | 3120  | 8500        | 2018-05-01 00:00:00 |

Я пытался объединить их по горизонтали, но я получаю неправильные результаты

SELECT YEAR(c.date_period)
     , MONTH(c.date_period)
     , SUM(c.opca_budget) MonthlyBudget
     , SUM(a.opca_budget) MonthlyUsage    
  FROM opexcapex c
  LEFT
  JOIN opxcpx_actuals a
    ON YEAR(c.date_period) = YEAR(a.date_period) 
   AND MONTH(c.date_period) = MONTH(a.date_period) 
 WHERE c.date_period BETWEEN '2018-03-01' AND '2019-02-29' 
 GROUP 
    BY YEAR(c.date_period)
     , MONTH(c.date_period);

+------+-------+---------------+--------------+
| Year | Month | MonthlyBudget | MonthlyUsage |
+------+-------+---------------+--------------+
| 2018 |     3 |        168000 |       364000 |
| 2018 |     4 |        224000 |       420000 |
| 2018 |     5 |        280000 |       476000 |
| 2018 |     6 |        336000 |       532000 |
| 2018 |     7 |       2520000 |       588000 |
| 2018 |     8 |        576000 |       367200 |
| 2018 |     9 |       3240000 |       367200 |
| 2018 |    10 |        720000 |       252000 |
| 2018 |    11 |        792000 |      1807200 |
| 2018 |    12 |       2583000 |      1323000 |
| 2019 |     1 |          9000 |         NULL |
| 2019 |     2 |         36000 |         NULL |
+------+-------+---------------+--------------+

Я ожидаю получить такие результаты:

+-----------+-------------+---------------+--------------+
| BudgtYear | BudgetMonth | MonthlyBudget | MonthlyUsage |
+-----------+-------------+---------------+--------------+
|      2018 |           3 |         24000 |  45500       |
|      2018 |           4 |         32000 |  52500       |
|      2018 |           5 |         40000 |  59500       |
|      2018 |           6 |         48000 |  66500       |
|      2018 |           7 |        360000 |  73500       |
|      2018 |           8 |         72000 |  40800       |
|      2018 |           9 |        405000 |  40800       |
|      2018 |          10 |         90000 |  28000       |
|      2018 |          11 |         99000 | 200800       |
|      2018 |          12 |        369000 | 147000       |
|      2019 |           1 |          9000 |              |
|      2019 |           2 |         36000 |              |
+-----------+-------------+---------------+--------------+

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Сначала вы сможете объединить 2 таблицы, а затем ВЫБРАТЬ из полученных данных, что-то вроде этого (обновленный запрос): -

SELECT YEAR(date_period), MONTH(date_period), MonthlyBudget, MonthlyUsage
FROM 

(SELECT date_period, opca_budget as MonthlyBudget, 0 as MonthlyUsage FROM 
opexcapex
UNION 
SELECT date_period, 0 as MonthlyBudget, opca_budget as MonthlyUsage FROM 
opxcpx_actuals) T1

WHERE date_period BETWEEN '2018-03-01' AND '2019-02-29'
GROUP BY YEAR(date_period), MONTH(date_period);
0 голосов
/ 15 февраля 2019

Вы хотите сделать UNION ALL в качестве подзапроса, а затем вычислить сумму по значению из этого подзапроса, обратите внимание также, что я использую два столбца суммы в объединении, но один всегда равен нулю, это должно иметьдва выбора возвращают одинаковое количество столбцов, но разделенные значения

SELECT YEAR(date_period) as year, MONTH(date_period) as month, SUM(mbudget) AS MonthlyBudget, SUM(musage) as MonthlyUsage
FROM (SELECT date_period, opca_budget mbudget, null musage
      FROM opexcapex 
      UNION ALL
      SELECT date_period, null, opca_budget 
      FROM opxcpx_actuals 
      ) sq
WHERE date_period BETWEEN '2018-03-01' AND '2019-02-29'
GROUP BY year, month
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...