【问题标题】:Nested query - looking for better solution嵌套查询 - 寻找更好的解决方案
【发布时间】:2011-08-11 06:21:13
【问题描述】:

考虑一个销售应用程序,其中我们有两个表 SALES 和 INTERNAL_SALES。

  • “SALES”表引用了公司外部每个销售人员进行的交易次数。
  • “INTERNAL_SALES”表引用了公司内部每个销售人员与其他销售人员进行的交易次数。

销售表: 即使交易为零,每个日期对每个销售人员都有一个条目。

编号 |天 |销售人员 | number_of_transactions 1 | 2011-08-01 |汤姆 | 1000 2 | 2011-08-01 |本 | 500 3 | 2011-08-01 |安妮 | 1500 4 | 2011-08-02 |汤姆 | 0 5 | 2011-08-02 |本 | 800 6 | 2011-08-02 |安妮 | 900 7 | 2011-08-03 |汤姆 | 3000 8 | 2011-08-03 |本 | 0 9 | 2011-08-03 |安妮 | 40

INTERNAL_SALES 表: 此表仅记录销售人员之间实际进行的交易。

编号 |天 | sales_person_from | sales_person_to | number_of_transactions 0 | 2011-08-01 |汤姆 |本 | 10 1 | 2011-08-01 |汤姆 |安妮 | 20 2 | 2011-08-01 |本 |汤姆 | 50 3 | 2011-08-03 |安妮 |汤姆 | 30 4 | 2011-08-03 |安妮 |汤姆 | 30

现在的问题是计算每个销售人员每天的总交易量。我这样做的方式是:

SELECT day, sales_person, sum(num_transactions) from ( SELECT day, sales_person, number_of_transactions As num_transactions FROM sales; 联盟 SELECT day, sales_person_from As sales_person, sum(number_of_transactions) As num_transactions FROM internal_sales GROUP BY day, sales_person_from; ) GROUP BY 天,sales_person;

这太慢了,而且看起来很丑。我正在寻求更好的解决方案。顺便说一下,Oracle 中使用的数据库,我无法控制数据库,但我可以对它运行查询。

【问题讨论】:

  • 这很慢吗?它对我来说一点也不丑。我没有看到更直接的解决方案。没有修改数据库的能力,这里没有什么可以优化的。

标签: sql oracle


【解决方案1】:

不需要聚合两次,并且联合运算符通常会执行隐式唯一排序,这在您的情况下也不是必需的。

SELECT day, sales_person, sum(num_transactions) from
(
    SELECT day, sales_person, number_of_transactions As num_transactions FROM sales;
    UNION ALL 
    SELECT day, sales_person_from, number_of_transactions FROM internal_sales;
)
GROUP BY day, sales_person;

删除中间聚合和唯一排序应该会有所帮助。

【讨论】:

  • +1 无需别名 SALES_PERSON_FROM,因为数据库从第一个 SELECT 语句中获取列名并忽略后续的。
  • 另外,UNION 可能会返回错误的结果。例如,如果销售代表 TOM 在同一天进行了 10 个外部销售和 10 个内部销售,则它们的合计数字为 20UNION 排序会将这两行视为重复项,因此聚合数字仅为10
  • 感谢您的帮助。您的解决方案附带的解释增加了我对 sql 的理解。
猜你喜欢
  • 2014-07-20
  • 1970-01-01
  • 2013-01-09
  • 2023-01-23
  • 1970-01-01
  • 2012-05-11
  • 2014-02-03
  • 1970-01-01
  • 2019-10-23
相关资源
最近更新 更多