如何将 ORDER BY 与由不同聚合函数创建的 2 列一起使用

How to use ORDER BY with 2 columns created by different aggregate functions

我试图在 ORDER BY 中使用 SALESPERSON_CUSTOMER_REVENUE(每个客户的销售人员收入)和每个销售人员的总收入。目前,我只能在 ORDER BY 语句中使用 SALESPERSONPERSONID 和 SALESPERSON_CUSTOMER_REVENUE。

SALES_ORDERS
-------------------------------------------------------------------------
|   SALESPERSONPERSONID    |      CUSTOMERID        |     ORDERID       |
-------------------------------------------------------------------------
|              3           |            10          |      324371       |
-------------------------------------------------------------------------

SALES_ORDERLINES
--------------------------------------------------------------------
|   ORDERID    |    ORDERLINEID    |   QUANTITY   |   UNITPRICE    |
--------------------------------------------------------------------
|   324371     |      10           |      32      |      100       |
--------------------------------------------------------------------

我当前查询

SELECT 
    ORD.SALESPERSONPERSONID,  
    ORD.CUSTOMERID,
    SUM(LINE.QUANTITY * LINE.UNITPRICE) AS SALESPERSON_CUSTOMER_REVENUE 
    
    FROM SALES_ORDERS ORD
        INNER JOIN SALES_ORDERLINES LINE
            ON ORD.ORDERID = LINE.ORDERID
                
    GROUP BY ORD.SALESPERSONPERSONID, ORD.CUSTOMERID
    ORDER BY ORD.SALESPERSONPERSONID, SALESPERSON_CUSTOMER_REVENUE DESC

预期结果

--------------------------------------------------------------------
| SALESPERSONPERSONID | CUSTOMERID | SALESPERSON_CUSTOMER_REVENUE |
--------------------------------------------------------------------
|       3             |     10     |             3200             |
--------------------------------------------------------------------
|       3             |     12     |             2200             |
--------------------------------------------------------------------
|       1             |     2      |             2000             |
--------------------------------------------------------------------
|       1             |     1      |             1200             |
--------------------------------------------------------------------
|       2             |     3      |             3000             |

TLDR: 我想按销售人员的总收入对销售人员进行排序,对于每个销售人员,我想按每个客户的收入进行排序。

请告诉我你的想法。谢谢!

嗯,您得到了相同的结果,因为您在每个聚合列中执行了完全相同的操作。我认为这将是 window function.

的一个很好的用例

因为你想获得按不同列分组的结果,PARTITION BY 解决了:

SELECT DISTINCT
  ORD.SALESPERSONID,  
  ORD.CUSTOMERID,
  SUM(LINE.QUANTITY * LINE.UNITPRICE) OVER (PARTITION BY SALESPERSONID) AS SALESPERSON_REVENUE, 
  SUM(LINE.QUANTITY * LINE.UNITPRICE) OVER (PARTITION BY SALESPERSONID, CUSTOMERID) AS SALESPERSON_CUSTOMER_REVENUE 
FROM 
  SALES_ORDERS AS ORD
INNER JOIN 
  SALES_ORDERLINES AS LINE ON ORD.ORDERID = LINE.ORDERID               
ORDER BY 
  SALESPERSON_REVENUE DESC,
  SALESPERSON_CUSTOMER_REVENUE DESC
  • 您会看到 SALESPERSON_REVENUE 列将汇总每个销售人员 SUM(LINE.QUANTITY * LINE.UNITPRICE) 的操作

  • SALESPERSON_CUSTOMER_REVENUE 将按 salesperson/customer 组合聚合操作 SUM(LINE.QUANTITY * LINE.UNITPRICE)

您可以将 window 函数放在 ORDER BY 子句中:

SELECT ORD.SALESPERSONPERSONID, ORD.CUSTOMERID,
       SUM(LINE.QUANTITY * LINE.UNITPRICE) AS SALESPERSON_CUSTOMER_REVENUE     
FROM SALES_ORDERS ORD JOIN
     SALES_ORDERLINES LINE
     ON ORD.ORDERID = LINE.ORDERID               
GROUP BY ORD.SALESPERSONPERSONID, ORD.CUSTOMERID
ORDER BY SUM(SUM(LINE.QUANTITY * LINE.UNITPRICE)) OVER (PARTITION BY ORD.SALESPERSONPERSONID), 
         ORD.SALESPERSONPERSONID,
         SALESPERSON_CUSTOMER_REVENUE DESC

请注意,有三个 ORDER BY 键。中间那个很重要。它处理两个销售人员的总收入相同的情况,并确保每个销售人员的行保持在一起。