Фильтруйте и сортируйте по вычисляемому столбцу, используя регистр (столбец не найден) - PullRequest
0 голосов
/ 21 мая 2019

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

Столбец разница_сумма и столбец платежей_сумма не найден

Мне нужно иметь предложение WHERE и ORDER BY.

У меня есть две таблицы «контракты» и «платежи».

Контракты Таблица

+----+-----------------+-----------+-----------+
| id | contract_number | legal_sum | bonus_sum |
+----+-----------------+-----------+-----------+
|  1 |    110258465651 |        50 |        20 |
|  2 |    564984656355 |        15 |        12 |
|  3 |    548498415165 |       150 |        35 |
+----+-----------------+-----------+-----------+

Платежи Таблица

+----+--------------+----------+
| id | contract_id  | paid_sum |
+----+--------------+----------+
|  1 | 564984656355 |        7 |
|  2 | 564984656355 |        1 |
|  3 | 564984656355 |        2 |
+----+--------------+----------+
  1. Сначала мне нужно вычислить разницу между законной суммой и суммой бонуса (diff_sum)
  2. Тогда мне нужно получить сумму платежей.paid_sum (payment_sum)
  3. Тогда мне нужно отсортировать по критериям, если (payment_sum - diff_sum <= 0) </li>

Итак, я сделал этот запрос, но он говорит, что разность_сум не существует:

SELECT
    (contracts.legal_sum - contracts.bonus_sum) as difference_sum
    sum(payments.paid_sum) as payments_sum,
    CASE
        WHEN (difference_sum - payments_sum) <= 0 THEN "All paid"
        WHEN (difference_sum - payments_sum) > 0 THEN "Not paid"
    END AS isPaid
FROM contracts
INNER JOIN payments on contracts.id = payments.contract_id
WHERE isPaid = "All paid"
ORDER BY isPaid

Пример вывода:

+----------------+--------------+----------+
| difference_sum | payments_sum |  isPaid  |
+----------------+--------------+----------+
|             30 |           30 | All paid |
|             48 |           15 | Not paid |
|            100 |          100 | All paid |
+----------------+--------------+----------+

1 Ответ

1 голос
/ 21 мая 2019

Попробуйте

SELECT difference_sum, payments_sum, isPaid 
FROM (
    SELECT  payments_sum,
        (contracts.legal_sum - contracts.bonus_sum) as difference_sum
        CASE
            WHEN (contracts.legal_sum - contracts.bonus_sum - payments_sum) <= 0 THEN "All paid"
            WHEN (contracts.legal_sum - contracts.bonus_sum - payments_sum) > 0 THEN "Not paid"
        END AS isPaid
    FROM contracts
    INNER JOIN ( 
       SELECT contract_id, sum(payments.paid_sum) as payments_sum
       FROM payments 
       GROUP BY contract_id
    ) payments on contracts.id = payments.contract_id
) q
WHERE isPaid = "All paid"
-- why order by a single value ?
-- ORDER BY isPaid 

Возможно, вам также нужно добавить столбец contract_id, чтобы сделать его более полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...