在MySQL中对并集的两部分求和有困难
所以我有一个问题应该不太难回答,但不管是什么原因,我都无法回答。我需要把两张不同桌子的费用加起来。我试过做一个长连接,但是数字本身就错了。我得到正确数字的唯一方法是进行两次查询并将它们相加。但是,我希望它们显示在一个ID下在MySQL中对并集的两部分求和有困难,mysql,sql,select,join,union,Mysql,Sql,Select,Join,Union,所以我有一个问题应该不太难回答,但不管是什么原因,我都无法回答。我需要把两张不同桌子的费用加起来。我试过做一个长连接,但是数字本身就错了。我得到正确数字的唯一方法是进行两次查询并将它们相加。但是,我希望它们显示在一个ID下 SELECT s.storeId, s.street, s.city, s.state, s.zipcode, SUM(p.cost) FROM store s JOIN video v ON s.storeId=v.storeId JOIN previousrental p
SELECT s.storeId, s.street, s.city, s.state, s.zipcode, SUM(p.cost)
FROM store s
JOIN video v ON s.storeId=v.storeId
JOIN previousrental p ON v.videoid=p.videoid
GROUP BY s.storeId
UNION
SELECT s.storeId, s.street, s.city, s.state, s.zipcode, SUM(r.cost)
FROM store s
JOIN video v ON s.storeId=v.storeId
JOIN rental r ON v.videoid=r.videoid
GROUP BY s.storeId
一种选择是将结果放入子查询中:
SELECT
storeId, street, city, state, zipcode, SUM(cost)
FROM
(SELECT s.storeId, s.street, s.city, s.state, s.zipcode, SUM(p.cost) cost
FROM store s
JOIN video v ON s.storeId = v.storeId
JOIN previousrental p ON v.videoid = p.videoid
GROUP BY s.storeId
UNION
SELECT s.storeId, s.street, s.city, s.state, s.zipcode, SUM(r.cost)
FROM store s
JOIN video v ON s.storeId = v.storeId
JOIN rental r ON v.videoid = r.videoid
GROUP BY s.storeId
) T
GROUP BY storeId
您可以将联合包装到派生表中,并对此进行推理:
SELECT x.storeId, x.street, x.city, x.state, x.zipcode, SUM(x.cost)
FROM
(
SELECT s.storeId, s.street, s.city, s.state, s.zipcode, p.cost
FROM store s
JOIN video v ON s.storeId=v.storeId
JOIN previousrental p ON v.videoid=p.videoid
UNION
SELECT s.storeId, s.street, s.city, s.state, s.zipcode, r.cost
FROM store s
JOIN video v ON s.storeId=v.storeId
JOIN rental r ON v.videoid=r.videoid
) x
GROUP BY x.storeId, x.street, x.city, x.state, x.zipcode;
记住按select中的所有非聚合列分组,即使它们是相关的 试试这个:
SELECT s.storeId, s.street, s.city, s.state, s.zipcode, SUM(p.cost)
FROM store s
INNER JOIN video v ON s.storeId=v.storeId
INNER JOIN (SELECT p.videoid, SUM(p.cost) cost
FROM previousrental p
GROUP BY p.videoid
UNION
SELECT r.videoid, SUM(r.cost) cost
FROM rental r
GROUP BY r.videoid
) AS p ON v.videoid=p.videoid
GROUP BY s.storeId;
或
SELECT s.storeId, s.street, s.city, s.state, s.zipcode,
SUM(ISNULL(p.cost, 0) + ISNULL(r.cosr, 0))
FROM store s
INNER JOIN video v ON s.storeId = v.storeId
LEFT OUTER JOIN (SELECT videoid, SUM(cost) cost FROM previousrental GROUP BY videoid) p ON v.videoid = p.videoid
LEFT OUTER JOIN (SELECT videoid, SUM(cost) cost FROM rental GROUP BY videoid) r ON v.videoid = r.videoid
GROUP BY s.storeId;