Я работаю с SQL.
У меня есть две таблицы
Таблица 1:
Идентификатор, имя-вещи, код-вещи, локализация-вещи
Таблица 2:
ID, thing_id, thing_value_1, thing_value_2, eval_year, eval_month, T1_ID
Таблица 1 содержит некоторые вещи. У вещи есть имя, код и локализация. Таблица 2 содержит записи, соответствующие разным оценкам вещей. Оценки, которые были сделаны ежемесячно.
Мы не оцениваем каждую вещь каждый месяц, поэтому у нас есть некоторые вещи, которые не оцениваются каждый месяц
ЧТО ХОЧУ СДЕЛАТЬ?
Я хочу:
1)
Я хочу, чтобы сумма оценок была сделана для каждой вещи, связанной с конкретным местным названием "LOCAL_0", до начала определенного года (года y).
Соответствующий SQL-запрос выглядит следующим образом:
SELECT T.thing_code, SUM(E.thing_eval_1), SUM(E.thing_eval_2)
FROM table1 T, table2 E
WHERE T.ID = E.T1_ID AND T.thing_localisation = "LOCAL_0" AND E.eval_year < y
2) Я хочу, чтобы сумма оценок вещей (связанных с LOCAL_0) была сделана с начала года y до конца месяца m в году y. SQL-запрос для этого выглядит так:
SELECT T.thing_code, SUM(E.thing_eval_1), SUM(E.thing_eval_2)
FROM table1 T, table2 E
WHERE T.ID = E.T1_ID AND T.thing_localisation = "LOCAL_0"
AND E.eval_year = y and E.eval_month <= m
Результат первого запроса выглядит как
+------------------------------------------------------+
| thing_code SUM_EVAL_1_BEFORE SUM_EVAL 2_BEFORE |
+------------------------------------------------------+
| 111 1 2 |
| 112 3 4 |
| 113 5 6 |
+------------------------------------------------------+
Результат второго запроса выглядит как
+-----------------------------------------------+
| thing_code SUM_EVAL_1_NOW SUM_EVAL_2_NOW |
+-----------------------------------------------+
| 110 0.5 0.3 |
| 111 0.1 0.1 |
| 112 1 0.9 |
+-----------------------------------------------+
3) Я хочу, наконец, построить запрос, который даст мне этот результат
+--------------------------------------------------------------------------+
| thing_code EVAL_1_BEF EVAL_2_BEF EVAL_1_NOW EVAL_2_NOW EVAL_1_NOW E2_NOW |
+--------------------------------------------------------------------------+
| 110 0 0 0.5 0.3 0.5 0.3 |
| 111 1 2 0.1 0.1 1.1 2.1 |
| 112 3 4 1 0.9 4 4.9 |
| 113 5 6 0 0 5 6 |
+--------------------------------------------------------------------------+
Чтобы сделать это, я искал и нашел запрос, который работает хорошо, но мне нужно слишком много времени, чтобы получить результат (потому что база данных очень большая, много записей, миллионы строк)
SELECT UN.code,
UN.Eval1_BEF,
UN.Eval2_BEF,
UN.Eval1_NOW,
UN.Eval2_NOW,
(UN.Eval1_BEF + UN.Eval1_NOW) AS Eval1_AFTER,
(UN.Eval2_BEF + UN.Eval2_NOW) AS Eval2_AFTER
FROM
(
SELECT R1.thing_code AS code, R1.Eval1 AS Eval1_BEF, R1.Eval2 AS Eval2_BEF, R2.Eval1 AS Eval1_NOW, R2.Eval2 AS Eval2_NOW
FROM Result_Request_1 R1 LEFT JOIN Result_Request_2 R2 ON R1.thing_code = R2.thing code
UNION
SELECT R2.thing_code AS code, R1.Eval1 AS Eval1_BEF, R1.Eval2 AS Eval2_BEF, R2.Eval1 AS Eval1_NOW, R2.Eval2 AS Eval2_NOW
FROM Result_Request_1 R1 RIGHT JOIN Result_Request_2 R2 ON R1.thing_code = R2.thing code
) UN
ORDER BY UN.code;
Я хочу оптимизировать этот запрос, потому что он занимает слишком много времени. Может кто-нибудь мне помочь? Извините за мой плохой английский ...