如何将 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
键。中间那个很重要。它处理两个销售人员的总收入相同的情况,并确保每个销售人员的行保持在一起。
我试图在 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
键。中间那个很重要。它处理两个销售人员的总收入相同的情况,并确保每个销售人员的行保持在一起。