[英]How to use a formula in a SQL query and sort on that result
在我的公司,我们使用排行榜来显示我们的销售代理的表现。 排行榜显示在 HTML 表中。 排行榜现在只包含特定时期(今天、本周和本月)的销售额。 现在我想通过添加那些时期的代理商赚取的佣金来扩大排行榜。 我使用以下公式计算我公司销售代理期间的佣金:
4*(x/y)*z
其中 x 是代理当月的总销售额,y 是代理当月的总工作时间,z 是代理在特定时期(一天或一周)内的销售额。 因此,为了计算某个时期的代理商佣金,必须考虑当月 rest 的性能。
我现在有两个 MySQL 数据表。 一种称为销售,另一种称为小时。 Sales 表中的每个条目都代表一个销售,其日期为 (finalized_at),当销售完成时,Hours 表中的每个条目代表代理工作的班次,包含工作时间和班次发生的日期。 表格如下所示:
销售表
+-------+--------------+
| agent | finalized_at |
+-------+--------------+
| John | 01-01-2020 |
+-------+--------------+
| John | 02-01-2020 |
+-------+--------------+
| Mark | 01-01-2020 |
+-------+--------------+
| Peter | 04-01-2020 |
+-------+--------------+
| John | 04-01-2020 |
+-------+--------------+
小时表
+-------+-------+------------+
| agent | hours | date |
+-------+-------+------------+
| John | 1 | 01-01-2020 |
+-------+-------+------------+
| John | 5 | 02-01-2020 |
+-------+-------+------------+
| Mark | 1 | 01-01-2020 |
+-------+-------+------------+
| Peter | 2 | 04-01-2020 |
+-------+-------+------------+
| John | 4 | 04-01-2020 |
+-------+-------+------------+
我现在正在尝试运行一个查询,我可以在其中计算从高到低排序的每个代理赚取的佣金。 无需创建新的数据表来保存佣金。 因此,如果我想计算 1 月 4 日赚取的佣金,我会得到以下结果:
+-------+------------+
| agent | commission |
+-------+------------+
| Peter | 2 |
+-------+------------+
| John | 1.2 |
+-------+------------+
所以我的问题是:如何构建一个查询,使用两个数据表中的信息来计算特定日期每个代理的佣金。
现在我想出了这个。 但这似乎不起作用。 如果给我以下错误消息: Reference 'sales' not supported (reference to group function)
SELECT agent,
COUNT(*) as sales,
(4*(SELECT COUNT(*)
FROM Sales Sales2
WHERE Sales2.agent=Sales.agent AND finalized_at BETWEEN '2020-01-01 00:00:00' AND '2020-01-31 23:59:59'))
/
(SELECT SUM(hours)
FROM Hours
WHERE date BETWEEN '2020-01-01 00:00:00' AND '2020-01-31 23:59:59' AND agent=Sales.agent) as sph
FROM Sales
WHERE finalized_at BETWEEN '2020-01-04 00:00:00' AND '2020-01-04 23:59:59'
GROUP BY agent
ORDER by (sph*sales) DESC
您可以将查询作为子查询并对结果进行排序,如下所示:
select * from (
SELECT agent,
COUNT(*) as sales,
(4*(SELECT COUNT(*)
FROM Sales Sales2
WHERE Sales2.agent=Sales.agent AND finalized_at BETWEEN '2020-01-01 00:00:00' AND '2020-01-31 23:59:59'))
/
(SELECT SUM(hours)
FROM Hours
WHERE date BETWEEN '2020-01-01 00:00:00' AND '2020-01-31 23:59:59' AND agent=Sales.agent) as sph
FROM Sales
WHERE finalized_at BETWEEN '2020-01-04 00:00:00' AND '2020-01-04 23:59:59'
GROUP BY agent
) r
order by sales * sph desc;
我不知道你的数据的性质,但我建议你使用独占端而不是之间,如下:
select * from (
SELECT agent,
COUNT(*) as sales,
(4*(SELECT COUNT(*)
FROM Sales Sales2
WHERE Sales2.agent=Sales.agent AND finalized_at >= '2020-01-01' AND finalized_at < '2020-02-01'))
/
(SELECT SUM(hours)
FROM Hours
WHERE date >= '2020-01-01' AND date < '2020-02-01' AND agent=Sales.agent) as sph
FROM Sales
WHERE finalized_at >= '2020-01-04' AND finalized_at < '2020-01-05'
GROUP BY agent
) r
order by sales * sph desc;
我曾经在“2020-01-04 00:00:00”和“2020-01-04 23:59:59”之间使用,就像你在这里使用的那样,我错过了 1 秒间隔 23:59:59 到00:00:00
db-fiddle的完整工作代码
您可以按计算排序,也可以按您为该计算提供的别名排序,下面是一个简单的示例,nb 我使用了降序:
CREATE TABLE hours( agent VARCHAR(7),hours INTEGER,date DATE ); INSERT INTO hours(agent,hours,date) VALUES ('John',1,'01-01-2020'); INSERT INTO hours(agent,hours,date) VALUES ('John',5,'02-01-2020'); INSERT INTO hours(agent,hours,date) VALUES ('Mark',1,'01-01-2020'); INSERT INTO hours(agent,hours,date) VALUES ('Peter',2,'04-01-2020'); INSERT INTO hours(agent,hours,date) VALUES ('John',4,'04-01-2020');
select agent, sum(hours) as sum_hours from hours group by agent order by sum(hours) DESC /* repeat the calculation here */, agent
代理| sum_hours:---- | --------: 约翰 | 10 彼得 | 2 马克 | 1
select agent, sum(hours) as sum_hours from hours group by agent order by sum_hours DESC /* or use the column alias here */, agent
代理| sum_hours:---- | --------: 约翰 | 10 彼得 | 2 马克 | 1
db<>fiddle Postgres 在这里
db<>fiddle MySQL 在这里
为了计算 x 你可以使用这个查询:
SELECT agent, COUNT(*) AS 'total number of sales in january'
FROM Sales
WHERE finilized_at BETWEEEN '01-01-2020' AND '31-01-2020'
GROUP BY 1;
为了计算 y 你可以使用这个查询:
SELECT agent, SUM(hours)
FROM Hours
WHERE date BETWEEN '01-01-2020' AND '31-01-2020'
GROUP BY 1;
要计算 z(a day),您可以使用以下查询:
SELECT agent, COUNT(*)
FROM Sales
WHERE finalized_at = '01-01-2020'
GROUP BY 1;
您可以使用 ORDER BY 语句对值进行排序。 在带有结果的新表中(让它成为佣金),您可以像这样使用它:
SELECT * FROM commisions
ORDER BY commission DESC;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.