所以,我的问题是:我与一家销售公司合作,正在开发一个使用MS Access 2007作为前端的应用程序,其中MySQL 5.6 Server作为后端。我试图生成一个计算每个代表的佣金数据的视图。
我的DDL如下:
CREATE TABLE emp_employees
(`id` int, `tsr_code` int, `first_name` varchar(9), `location_id` int)
;
INSERT INTO emp_employees
(`id`, `tsr_code`, `first_name`, `location_id`)
VALUES
(47, 829, 'ELIZABETH', 6),
(199, 818, 'ERIC', 6),
(1642, 301, 'JACK', 4),
(2346, 619, 'SHANNA', 5),
(2386, 899, 'MICHAEL', 3),
(2490, 590, 'KARRIE', 4),
(2642, 386, 'MINDI', 3),
(2914, 615, 'REMELL', 3),
(3150, 025, 'TEAL', 3),
(3156, 609, 'JESSICA', 5)
;
CREATE TABLE x_recap
(`recap_id` int, `sale_date` datetime, `location_id` int, `tsr_id` int, `ver_id` int, `tsr_cpo` decimal(10,4), `ver_cpo` decimal(10,4))
;
INSERT INTO x_recap
(`recap_id`, `sale_date`, `location_id`, `tsr_id`, `ver_id`, `tsr_cpo`, `ver_cpo`)
VALUES
(423670, '2017-01-23 08:15:44', 5, 3156, 2346, 9.0000, 1.5000),
(423671, '2017-01-23 08:16:03', 6, 199, 47, 13.5000, 1.5000),
(423672, '2017-01-23 08:16:41', 3, 3150, 2914, 4.7500, 0),
(423673, '2017-01-23 08:17:08', 3, 2386, 2642, 8.7500, 1.50),
(423674, '2017-01-23 08:17:28', 5, 2346, 2346, 5.7500, 0.50)
;
期望的结果:
+------------+-------------+------------+----------+----------+
| sale_date | location_id | first_name | tsr_comm | ver_comm |
+------------+-------------+------------+----------+----------+
| 2017-01-23 | 3 | MICHAEL | 8.7500 | 0.0000 |
| 2017-01-23 | 3 | MINDI | 0.0000 | 1.5000 |
| 2017-01-23 | 3 | REMELL | 0.0000 | 0.0000 |
| 2017-01-23 | 3 | TEAL | 4.7500 | 0.0000 |
| 2017-01-23 | 5 | JESSICA | 9.0000 | 0.0000 |
| 2017-01-23 | 5 | SHANNA | 5.7500 | 2.0000 |
| 2017-01-23 | 6 | ELIZABETH | 0.0000 | 1.5000 |
| 2017-01-23 | 6 | ERIC | 13.5000 | 0.0000 |
+------------+-------------+------------+----------+----------+
编辑(2017-12-13):请注意员工2346,#34; Shanna"如何以1.50美元进行一次验证(recap_id = 423670)。她还有一个自我验证的销售(recap_id = 423674)另外还有0.5美元的验证佣金和5.75美元的销售额。这些必须单独跟踪。
从小提琴中可以看出,我可以使用Union查询以我想要的方式显示数据。当我在"回顾"中加载4100个员工记录和236K个销售条目时,问题就出现了。读完后,我明白我的查询现在需要很长时间(大约30秒),因为MySQL正在从union创建一个临时表,然后从未编制索引的临时表中执行外部查询。当我向每个联盟添加一个WHERE子句时,时间会急剧减少。
我觉得必须有一些我缺失的东西:一种特殊的内部联接,一种东西。即使我每天都使用MySQL,我仍然是相当新的MySQL(我的工作通常只需要一些concat()偶尔使用内部连接)。我几乎可以接受任何事情。 如果事实证明这是最好的选择 (也许还有一些社区帮助),我不会超出部分重新设计我的表格。
目标: 对于emp_employees表中的每个员工,我需要获取tsr_cpo字段的总和(sum(RECAP.tsr_cpo)其中EMP.id = RECAP .tsr_id)。我还需要为验证销售的人获得ver_cpo的总和(总和(RECAP.ver_cpo),其中EMP.id = RECAP.ver_id)。
答案 0 :(得分:0)
我查看了你的问题并且我同意维护一堆UNION查询以创建上面提到的“期望结果”似乎非常昂贵和困难。
编辑12-14-2017:根据您对我的回答的评论,我在下面做了一些更改。
我认为这可以通过两个相当简单的查询来完成。第一个名为qry_Comms
的查询具有以下SQL代码:
SELECT x_recap.sale_date, emp_employees.location_id, emp_employees.id, emp_employees.first_name, Sum(x_recap.tsr_cpo) AS tsr_comm, 0 AS ver_comm
FROM x_recap INNER JOIN emp_employees ON x_recap.tsr_id = emp_employees.id
GROUP BY x_recap.sale_date, emp_employees.location_id, emp_employees.id, emp_employees.first_name, 0
UNION ALL
SELECT x_recap.sale_date, emp_employees.location_id, emp_employees.id, emp_employees.first_name, 0 AS tsr_comm, Sum(x_recap.ver_cpo) AS ver_comm
FROM x_recap INNER JOIN emp_employees ON x_recap.ver_id = emp_employees.id
GROUP BY x_recap.sale_date, emp_employees.location_id, emp_employees.id, emp_employees.first_name, 0;
然后第二个名为qry_TotalComms
的查询具有以下SQL代码:
SELECT qry_Comms.sale_date, qry_Comms.location_id, qry_Comms.first_name, Sum(qry_Comms.tsr_comm) AS SumOftsr_comm, Sum(qry_Comms.ver_comm) AS SumOfver_comm
FROM qry_Comms
GROUP BY qry_Comms.sale_date, qry_Comms.location_id, qry_Comms.first_name, qry_Comms.id;
qry_Comms
查询是获取所需数据的基本查询,第二个查询qry_TotalComms
应该正确地将所有数据组合在一起。因此,您所要做的就是将这两个查询保存在Access数据库中,然后运行qry_TotalComms
查询。根据您上面的“所需结果”表(以及您对原始答案的评论),我认为应该提供正确的结果。
此外,如果这些查询的执行速度仍然不够快,请尝试对qry_Comms
查询使用MS Access“Pass-Through”查询,该查询是可在其上选择的MS Access查询类型之一。 “查询设计”功能区菜单。 Access“Pass-Through”查询将SQL代码直接发送到数据库服务器,并让服务器执行处理并返回结果记录集。所有其他类型的Access查询实际上都会将表数据全部复制到本地,然后在本地创建结果数据集,如果您处理大表,这可能会很慢而且成本很高。因此,当使用带有Access的MySQL或SQL Server时,“传递”查询可以极大地提高您的Access应用程序性能。
最后,您还可以创建我在MySQL数据库中作为视图提供的上述查询,然后直接从Access调用qry_TotalComms
视图。这将是可能改进我上面给出的查询性能的第二种选择。
无论如何,我希望这些信息有所帮助,但如果您对此有任何疑问,请告诉我,我会尽力帮助您解决问题!