簡體   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