假设您有以下表:
表名: Salesman字段:S_ID(主键),名称
表名: Region_1字段:Reg_ID(主键)、S_ID(外键)、sales
表名: Region_2字段:Reg_ID(主键)、S_ID(外键)、sales
表名: Region_3字段:Reg_ID(主键)、S_ID(外键)、sales
表名: Region_4字段:Reg_ID(主键)、S_ID(外键)、sales
问题1:查询每个业务员在所有区域的销售合计。
问题2:找出一个特定推销员在所有地区的总销售额。(如果第一个问题解决了,我想这会很容易。:-) )
发布于 2010-04-06 01:25:56
问题1:查询每个业务员在所有区域的销售合计。
使用:
SELECT s.name,
COALESCE(SUM(x.sales), 0)
FROM SALESMAN s
LEFT JOIN (SELECT r1.s_id,
r1.sales
FROM REGION_1 r1
UNION ALL
SELECT r2.s_id,
r2.sales
FROM REGION_2 r2
UNION ALL
SELECT r3.s_id,
r3.sales
FROM REGION_3 r3
UNION ALL
SELECT r4.s_id,
r4.sales
FROM REGION_4 r4) x ON x.s_id = s.s_id问题2:找出一个特定推销员在所有地区的总销售额。
将WHERE子句添加到上述查询中:
SELECT s.name,
COALESCE(SUM(x.sales), 0)
FROM SALESMAN s
LEFT JOIN (SELECT r1.s_id,
r1.sales
FROM REGION_1 r1
UNION ALL
SELECT r2.s_id,
r2.sales
FROM REGION_2 r2
UNION ALL
SELECT r3.s_id,
r3.sales
FROM REGION_3 r3
UNION ALL
SELECT r4.s_id,
r4.sales
FROM REGION_4 r4) x ON x.s_id = s.s_id
WHERE s.s_id = ?将?与销售人员的s_id值进行...replace。
教训: UNION vs UNION ALL
UNION和UNION ALL将允许您组合两个查询,但它们在列位置必须具有相同的数据类型。例如,假设查询一按以下顺序返回数据类型:
任何与第一个查询联合的后续查询都必须在same position中返回相同数据类型。要特别注意数据类型的事实--它不能保证列中的数据。
工会面临的第二个问题是了解UNION和UNION ALL之间的区别。如果存在重复项,UNION会将其删除(相当于使用DISTINCT),这在给定的场景中是不需要的。UNION ALL将不会删除重复项,因此速度更快。
发布于 2010-04-06 01:18:06
这种设计看起来有点局限,但可能是老师想要引入一些新概念的方式,所以让我们不在这一点上争论太久。
读一读
UNION
UNION用于将多个SELECT语句的结果合并为一个结果集。
GROUP BY and SUM用于按特定的销售人员分组,并对这些值求和。
发布于 2010-04-06 01:15:25
我同意这是一个糟糕的数据库设计,但如果是家庭作业,我想这不是问题所在。我会考虑用一个联盟来解决这个问题--将salesman和所有的region表连接在一起,并将销售额数字相加。
https://stackoverflow.com/questions/2579744
复制相似问题