此SQL查询的解决方案?

此SQL查询的解决方案?,sql,mysql,Sql,Mysql,假设您有以下表格: 表名:销售员 字段:S_ID(主键),名称 表名:区域_1 字段:注册ID(主键)、注册ID(外键)、销售 表名:区域2 字段:注册ID(主键)、注册ID(外键)、销售 表名:区域3 字段:注册ID(主键)、注册ID(外键)、销售 表名:区域4 字段:注册ID(主键)、注册ID(外键)、销售 查询1:找出所有地区每个销售员的销售总额 查询2:找出某个销售员在所有地区的销售总额。(如果第一个问题解决了,我想这会很容易。:-)我同意这是一个糟糕的数据库设计,但如果是家庭作业,我想

假设您有以下表格:

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

表名:区域_1 字段:注册ID(主键)、注册ID(外键)、销售

表名:区域2 字段:注册ID(主键)、注册ID(外键)、销售

表名:区域3 字段:注册ID(主键)、注册ID(外键)、销售

表名:区域4 字段:注册ID(主键)、注册ID(外键)、销售

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


查询2:找出某个销售员在所有地区的销售总额。(如果第一个问题解决了,我想这会很容易。:-)

我同意这是一个糟糕的数据库设计,但如果是家庭作业,我想这不是问题所在。我会考虑用一个联盟来解决这个问题——加入销售员和所有的区域表,并对销售额进行汇总。< /P> < P>查询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
或:

或者


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

这个设计似乎有点有限,但可能是老师想要介绍一些新概念的方式,所以我们不要在这一点上争论太久

读一读

并集用于合并结果 从多个SELECT语句到 单一结果集

并按特定销售人员进行分组,并求和。

Query 1:找出所有地区每个销售人员的销售总额。
使用:

查询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 = ?
…用销售人员的id值替换

教训:工会对全体工会
UNION
UNION ALL
将允许您组合两个查询,但它们必须在列位置具有相同的数据类型。例如,假设QueryOne按以下顺序返回数据类型:

  • 整数
  • 联合到第一个查询的任何后续查询都必须返回位于相同位置的相同数据类型。请特别注意数据类型的事实-它不能保证列中的数据


    工会的第二个问题是了解
    UNION
    UNION ALL
    之间的区别
    UNION
    将删除存在的重复项(相当于使用
    DISTINCT
    ),这在给定场景中是不需要的<代码>联合所有将删除重复项,因此速度更快。

    嗯。。。我认为你应该仔细阅读数据库规范化。或者,如果桌子设计是问题的一部分,那么也许你的老师应该这样做。到目前为止你做了哪些尝试,你遇到了哪些问题?我不打算只为你做家庭作业。到目前为止,你已经尝试过了,你把这个标记为家庭作业是好的,但我们不会为你做…我理解正确吗,你把每个区域都放在一张单独的桌子上了吗?天哪,托莱多,他是个做作业的孩子——当然,他只需要打开大聚光灯,打开迫击板来召唤老师?这就是为什么他是个讨厌的人-selects@Col.Shrapnel,下一个问题可能是关于规范化表,所以你可以看到查询是多么简单。是的,我承认这是一个糟糕的设计,但我的一个大三学生在他的项目中问了我这个问题。
       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
    
       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 = ?