这个SQL查询的解决方案?

时间:2010-04-05 17:11:38

标签: sql mysql

假设你有这些表:

表名:推销员 字段:S_ID(主键),名称

表名:Region_1 字段:Reg_ID(主键),S_ID(外键),销售

表名:Region_2 字段:Reg_ID(主键),S_ID(外键),销售

表名:Region_3 字段:Reg_ID(主键),S_ID(外键),销售

表名:Region_4 字段:Reg_ID(主键),S_ID(外键),销售

查询1:查看所有地区的每个销售员的总销售额。

查询2:查看所有地区的特定销售员的总销售额。 (如果第一个问题解决了,我认为这很容易。:-))

4 个答案:

答案 0 :(得分:4)

这个设计似乎有点受限,但是老师可能想要引入一些新的概念,所以不要争论那么长。

阅读一点

UNION

  

UNION用于组合结果   从多个SELECT语句转换为   单个结果集。

GROUP BY and SUM由特定销售人员分组,并对值进行求和。

答案 1 :(得分:4)

查询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值。

课程:UNION vs UNION ALL


UNIONUNION ALL将允许您合并两个查询,但它们必须在列位置具有相同的数据类型。例如,假设查询一按以下顺序返回数据类型:

  1. 整数
  2. 字符串
  3. 与第一个联合的任何后续查询必须返回相同位置中的相同数据类型。要特别注意数据类型的事实 - 它不保证列中的数据。

    UNION的第二个问题是了解UNIONUNION ALL之间的区别。 UNION将删除重复项(如果它们存在(相当于使用DISTINCT),这在给定方案中是不需要的。 UNION ALL删除重复项,因此更快。

答案 2 :(得分:2)

我同意这是一个糟糕的数据库设计,但如果它是家庭作业,我想这不是有问题的部分。我会考虑用工会 - 加入销售员和所有地区表来解决这个问题,并总结销售数据。

答案 3 :(得分:2)

查询1:

SELECT S.S_ID, S.Name, 
  ((SELECT SUM(R1.sales) FROM Region_1 R1 WHERE S.S_ID = R1.S_ID) +
   (SELECT SUM(R2.sales) FROM Region_2 R2 WHERE S.S_ID = R2.S_ID) +
   (SELECT SUM(R3.sales) FROM Region_3 R3 WHERE S.S_ID = R3.S_ID) +
   (SELECT SUM(R4.sales) FROM Region_4 R4 WHERE S.S_ID = R4.S_ID)) Total
FROM Salesman S

或者:

SELECT S.S_ID, S.Name, (IFNULL(R1.sales, 0) + IFNULL(R2.sales, 0) + IFNULL(R3.sales, 0) + IFNULL(R4.sales, 0)) Total
FROM Salesman S LEFT JOIN Region_1 R1 ON S.S_ID = R1.S_ID
     LEFT JOIN Region_2 R2 ON S.S_ID = R2.S_ID
     LEFT JOIN Region_3 R3 ON S.S_ID = R3.S_ID
     LEFT JOIN Region_4 R4 ON S.S_ID = R4.S_ID;

或......

创建更好的架构。如果业务扩展到其他国家,你会怎么做?突然间你有200000个地区? : - )。

相关问题