繁体   English   中英

如何在 SQL 查询中使用公式并对该结果进行排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM