为什么(mysql)UNION无法解决我的问题?

时间:2019-01-08 13:36:33

标签: mysql sql group-by

我是sql的新手。基本上,我正在尝试从一张表中SUM超过某种ID的金额。我有这部分,但我也想知道那个人是否活跃,那是来自另一个表。我知道我可以使用我的ID,并且已经尝试了UNION,但到目前为止还没有运气。

提供数据p.inactive

SELECT p.inactive
FROM deb d
    RIGHT JOIN pat p ON(d.debitor = p.cpr);

d.amount有效,但p.inactive无效,因为LEFT JOIN

SELECT SUM(d.amount), p.inactive
FROM deb d
    LEFT JOIN pat p ON(d.debitor = p.cpr)
GROUP BY d.debitor;

因此,我尝试将它们与UNION结合使用,但是p.inactive仍然是null

(   SELECT d.debitor, p.inactive FROM deb d 
        LEFT JOIN pat p ON d.debitor = p.cpr
)
UNION
(
    SELECT d.debitor, p.inactive FROM deb d 
        RIGHT JOIN pat p ON d.debitor = p.cpr
    WHERE d.debitor IS NULL
);

我现在完全被卡住了吗?有人可以帮忙吗?不用看我的数据库就可以了吗?让我知道是否需要提供更多数据/信息。

----------------------更新

表deb

借方|金额

1 ... | ... 10

1 ... | ... 20

1 ... | ... 45

2 ... | ... 30

2 ... | ... 10

餐桌拍子

cpr ... | ...无效

1 ... | ... 0

2 ... | ... 1

3 ... | ... 0

4 ... | ... 0

5 ... | ... 1

6 ... | ... 1


p.cpr和d.debitor = 1的人的总和为75,并且是无效的

p.cpr和d.debitor = 2的人的总和为40,并且处于活动状态

最终更新:

糟糕,我假设pat.cpr中有一些deb.debitors,但没有,因此没有匹配项。下次,我将针对课程的第一部分进行测试。

2 个答案:

答案 0 :(得分:1)

假设借方-cpr被多对一连接,您可以使用左连接示例,但要在GROUP BY子句中包含所需的列:

SELECT SUM(d.amount), p.inactive
FROM deb d
LEFT JOIN pat p ON d.debitor = p.cpr
GROUP BY d.debitor, p.inactive;

或者您可以在分组后加入(这使您可以包括通常不能在分组依据内使用的列):

SELECT a.debitor, a.total, p.whatever
FROM (
    SELECT d.debitor, SUM(d.amount) total
    FROM deb d
    GROUP BY d.debitor
) AS a
LEFT JOIN pat p ON a.debitor = p.cpr

PS:如果要从右表中消除NULL值,则需要INNER JOIN

答案 1 :(得分:1)

因此d.debitorp.cpr的外键。
也许我缺少了一些东西,但是在那种情况下,解决方案看起来很简单:

SELECT    pat.cpr,
          pat.inactive,
          COALESCE(SUM(deb.amount), 0) AS sum_amount
FROM      pat
LEFT JOIN deb
       ON pat.cpr = deb.debitor
GROUP BY  pat.cpr,
          pat.inactive;

如果特定deb.debitor没有相应的pat.cpr,则返回总计为0。