Сумма запроса в более чем одной таблице - PullRequest
0 голосов
/ 31 октября 2018

Как дела? У меня есть база данных MySQL. Я пытаюсь сделать запрос немного сложным. Я собираюсь записать, что я сделал до сих пор.

Запрос № 1

SELECT BONOD_AMOUNT, BONOD_DETAILS_ID
FROM  `BONOD_DETAILS` 
WHERE BONOD_ID
IN (
SELECT BONOD_ID
FROM BONOD_TABLE
WHERE USER_ID =16
)

Результат:

    BONOD_AMOUNT    BONOD_DETAILS_ID
    10000           3
    1520            4

введите описание изображения здесь

Запрос №2

SELECT SUM( AMOUNT ) THE_SUM, BONOD_DETAILS_ID
FROM EXPENSES_TABLE
WHERE BONOD_DETAILS_ID
IN (
SELECT BONOD_DETAILS_ID
FROM BONOD_DETAILS
WHERE USER_ID =16
AND BONOD_ENABLE =1
) GROUP BY BONOD_DETAILS_ID
UNION ALL
SELECT 0 AS THE_SUM, BONOD_DETAILS_ID
FROM BONOD_DETAILS
WHERE BONOD_ID
IN (
SELECT BONOD_ID
FROM BONOD_TABLE
WHERE USER_ID =16
)
AND BONOD_DETAILS_ID NOT 
IN (SELECT BONOD_DETAILS_ID
FROM EXPENSES_TABLE
)

Результат:

 THE_SUM    BONOD_DETAILS_ID
 270        3
 0          4

введите описание изображения здесь

Итак, я хотел бы получить запрос на вычитание из BONOD_AMOUNT в # Query1 и BONOD_AMOUNT в # Query2

Результаты могут быть:

 THE_SUB    BONOD_DETAILS_ID
 9730       3
 1520       4

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Я считаю, что в вашем # Query2 есть небольшая ошибка. в союзе все части. Я думаю, чтобы работать, вы должны сделать следующее:

SELECT 0 AS THE_TOTAL_SPENT , BONOD_DETAILS_ID
FROM BONOD_DETAILS
WHERE BONOD_ID
IN (
SELECT BONOD_ID
FROM BONOD_TABLE
WHERE USER_ID =16
)
AND BONOD_DETAILS_ID NOT 
IN (
SELECT BONOD_DETAILS_ID
FROM EXPENSES_TABLE WHERE USER_ID = 16
)

так, как ответил JNevill. Запрос будет

SELECT A.TOTAL_AMOUNT-B.THE_TOTAL_SPENT AS TOTAL, 
A.TOTAL_AMOUNT, B.THE_TOTAL_SPENT,A.BONOD_DETAILS_ID
FROM
(SELECT BONOD_AMOUNT TOTAL_AMOUNT , BONOD_DETAILS_ID
FROM  `BONOD_DETAILS ` 
WHERE BONOD_ID
IN ( SELECT BONOD_ID
FROM BONOD_TABLE
WHERE USER_ID =16
)) A, 
( SELECT SUM( AMOUNT ) THE_TOTAL_SPENT, BONOD_DETAILS_ID
fROM EXPENSES_TABLE
WHERE BONOD_DETAILS_ID
IN (
SELECT BONOD_DETAILS_ID
FROM BONOD_DETAILS
WHERE USER_ID =16
AND BONOD_ENABLE =1
)
GROUP BY BONOD_DETAILS_ID
UNION ALL 
SELECT 0 AS THE_TOTAL_SPENT , BONOD_DETAILS_ID
FROM BONOD_DETAILS
WHERE BONOD_ID
IN (
SELECT BONOD_ID
FROM BONOD_TABLE
WHERE USER_ID =16
)
AND BONOD_DETAILS_ID NOT 
IN (
SELECT BONOD_DETAILS_ID
FROM EXPENSES_TABLE WHERE USER_ID = 16
)
) B
WHERE A.BONOD_DETAILS_ID = B.BONOD_DETAILS_ID
0 голосов
/ 31 октября 2018

Самый простой способ - просто объединить эти два в BONOD_DETAILS_ID и вычесть этот первый столбец:

SELECT
    sub1.BONOD_AMOUNT - sub2.THE_SUM AS THE_SUB, sub1.BONOD_DETAILS_ID
FROM
    (
        SELECT BONOD_AMOUNT, BONOD_DETAILS_ID
        FROM  `BONOD_DETAILS` 
        WHERE BONOD_ID
        IN (
        SELECT BONOD_ID
        FROM BONOD_TABLE
        WHERE USER_ID =16
        )
    )sub1
    LEFT OUTER JOIN 
    (
        SELECT SUM( AMOUNT ) THE_SUM, BONOD_DETAILS_ID
        FROM EXPENSES_TABLE
        WHERE BONOD_DETAILS_ID
        IN (
        SELECT BONOD_DETAILS_ID
        FROM BONOD_DETAILS
        WHERE USER_ID =16
        AND BONOD_ENABLE =1
        ) GROUP BY BONOD_DETAILS_ID
        UNION ALL
        SELECT 0 AS THE_SUM, BONOD_DETAILS_ID
        FROM BONOD_DETAILS
        WHERE BONOD_ID
        IN (
        SELECT BONOD_ID
        FROM BONOD_TABLE
        WHERE USER_ID =16
        )
        AND BONOD_DETAILS_ID NOT 
        IN (SELECT BONOD_DETAILS_ID
        FROM EXPENSES_TABLE
        )
    ) sub2 ON sub1.BONOD_DETAILS_ID = sub2.BONOD_DETAILS_ID

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

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