Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在SQL查询中使用公式并对结果进行排序_Mysql_Sql - Fatal编程技术网

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

Mysql 如何在SQL查询中使用公式并对结果进行排序,mysql,sql,Mysql,Sql,在我的公司,我们使用排行榜来展示我们销售代理的业绩。引线板显示在HTML表格中。排行榜现在只包含今天、本周和本月特定时期的销售额。现在,我想通过添加这些时期代理商赚取的佣金来扩大排行榜。我使用以下公式计算我公司某一时期的销售代理佣金: 4*(x/y)*z 其中x是代理人当月的总销售额,y是代理人当月工作的总小时数,z是代理人在某段时间内每天或每周的销售额。因此,为了计算某一时期代理人的佣金,必须考虑该月其余时间的业绩 我现在有两个MySQL数据表。一个叫销售,另一个叫小时。Sales表中的每个

在我的公司,我们使用排行榜来展示我们销售代理的业绩。引线板显示在HTML表格中。排行榜现在只包含今天、本周和本月特定时期的销售额。现在,我想通过添加这些时期代理商赚取的佣金来扩大排行榜。我使用以下公式计算我公司某一时期的销售代理佣金:

4*(x/y)*z
其中x是代理人当月的总销售额,y是代理人当月工作的总小时数,z是代理人在某段时间内每天或每周的销售额。因此,为了计算某一时期代理人的佣金,必须考虑该月其余时间的业绩

我现在有两个MySQL数据表。一个叫销售,另一个叫小时。Sales表中的每个条目代表一次销售,销售完成日期为,Hours表中的每个条目代表代理人的班次,包含工作时间和班次发生日期。这些表如下所示:

SELECT * FROM commisions
ORDER BY commission 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;
销售表

+-------+--------------+
| 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        |
+-------+------------+
所以我的问题是:我如何构造一个查询,其中我使用两个数据表中的信息来计算特定日期每个代理的佣金

现在我想到了这个。但这似乎不起作用。If给我以下错误消息:引用“sales”不支持引用组功能


为了计算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;
SELECT agent, SUM(hours) 
FROM Hours
WHERE date BETWEEN '01-01-2020' AND '31-01-2020'
GROUP BY 1;
SELECT agent, COUNT(*)
FROM Sales
WHERE finalized_at = '01-01-2020'
GROUP BY 1;
为了计算y,您可以使用以下查询:

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;
SELECT agent, SUM(hours) 
FROM Hours
WHERE date BETWEEN '01-01-2020' AND '31-01-2020'
GROUP BY 1;
SELECT agent, COUNT(*)
FROM Sales
WHERE finalized_at = '01-01-2020'
GROUP BY 1;
要计算za日,您可以使用以下查询:

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;
SELECT agent, SUM(hours) 
FROM Hours
WHERE date BETWEEN '01-01-2020' AND '31-01-2020'
GROUP BY 1;
SELECT agent, COUNT(*)
FROM Sales
WHERE finalized_at = '01-01-2020'
GROUP BY 1;
可以使用ORDERBY语句对值进行排序。在新的resultslet表中,您可以这样使用它:

SELECT * FROM commisions
ORDER BY commission 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;

您可以根据计算或您为该计算提供的别名进行排序,下面是一个简单的示例,注意,我使用了降序:

迪迪尔博士后


DBFIDLE MySQL

您可以将查询作为子查询并对结果进行排序,如下所示:

SELECT * FROM commisions
ORDER BY commission 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”之间使用过,就像您在这里使用的那样,我错过了一秒间隔23:59:59到00:00:00的记录


位于

的完整工作代码能否包含您当前的查询?为什么您要在Postgres中为MySQL中的问题提供解决方案?SQL解决方案不依赖于我在示例中使用的dbms。在我回答时,db FIDLE的MySQL选项不允许创建示例表。因此,我使用了另一个dbms,但SQL对于MySQL来说仍然是可行的,关于使用between。但我接受风险。这种情况发生的可能性非常小,即使发生了,后果也并不严重