在多个表中查询总和

问题描述 投票:-1回答:2

你好吗 ?我有mysql数据库。我试图让查询有点复杂。我要写下我到目前为止所做的事情。

Query NO1

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

enter image description here

Query No2

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

enter image description here

所以,我想从#Query1中的BONOD_AMOUNT和#Query2中的BONOD_AMOUNT进行减法查询

结果可以是:

 THE_SUB    BONOD_DETAILS_ID
 9730       3
 1520       4
mysql sql
2个回答
0
投票

我相信你的#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

1
投票

最简单的方法是将这两个连接到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

我想这可以简化,但由于我看不到你的数据,也不知道你的桌子的关系,我不能肯定地说。我可以说这会得到你想要的结果。

© www.soinside.com 2019 - 2024. All rights reserved.