如何从数据集中筛选每年每月最高盈利客户的计费与非计费工时?
问题描述
我需要从数据集中确定最高盈利的客户。目前得到的结果存在问题:计费列显示工时,但非计费列为空;查询返回所有客户而非每月最佳客户等。
以下是我当前编写的查询,该查询已实现将计费与非计费工时显示在同一行:
Select date_format(date, '%Y-%m') AS "yearMonth", ClientNumber AS "Client Number", Sum(Case When BillType = 'Billable' Then Hours End) As "Billable Hours", Sum(Case When BillType = 'NonBillable' Then Hours End) As "Non-Billable Hours", Sum(Hours) As "Total Hours", From Towson WHERE ClientID Group By yearMonth Order By yearMonth;
查询结果如下:
| yearMonth | Client ID | Billable Hours | Non-Billable Hours | Total Hours |
|---|---|---|---|---|
| 2019-01 | 3670 | 28846.93 | 25539.88 | 54386.81 |
| 2019-02 | 3670 | 31763.55 | 19631.36 | 51394.91 |
| 2019-03 | 3983 | 35347.79 | 20010.64 | 55358.43 |
| 2019-04 | 1373 | 30674.63 | 22797.92 | 53472.55 |
| 2019-05 | 3670 | 25599.79 | 26535.00 | 52134.79 |
| 2019-06 | 3670 | 23992.33 | 25159.50 | 49151.83 |
| 2019-07 | 3244 | 25710.52 | 28995.55 | 54706.07 |
| 2019-08 | 3670 | 26738.45 | 23201.93 | 49940.38 |
| 2019-09 | 3670 | 28192.16 | 21243.57 | 49435.73 |
| 2019-10 | 3670 | 28682.27 | 24676.72 | 53358.99 |
| 2019-11 | 1691 | 18651.72 | 27537.36 | 46189.08 |
| 2019-12 | 3824 | 19286.49 | 29229.77 | 48516.26 |
| 2020-01 | 2174 | 28427.96 | 27706.00 | 56133.96 |
| 2020-02 | 3670 | 33946.23 | 20179.19 | 54125.42 |
| 2020-03 | 3670 | 35047.99 | 22220.25 | 57268.24 |
| 2020-04 | 2722 | 29763.41 | 23876.59 | 53640.00 |
| 2020-05 | 1174 | 25515.83 | 24374.23 | 49890.06 |
| 2020-06 | 2722 | 30021.44 | 25017.45 | 55038.89 |
| 2020-07 | 1439 | 27714.53 | 28563.12 | 56277.65 |
| 2020-08 | 2729 | 27126.38 | 22998.78 | 50125.16 |
| 2020-09 | 1961 | 29645.68 | 25191.37 | 54837.05 |
| 2020-10 | 1691 | 27744.36 | 26797.16 | 54541.52 |
| 2020-11 | 2169 | 22059.87 | 29683.95 | 51743.82 |
| 2020-12 | 2322 | 23738.35 | 33736.25 | 57474.60 |
| 2021-01 | 2650 | 29637.70 | 25209.81 | 54847.51 |
| 2021-02 | 1695 | 34480.73 | 20855.44 | 55336.17 |
| 2021-03 | 3670 | 41603.98 | 23543.83 | 65147.81 |
| 2021-04 | 3670 | 35361.13 | 24019.48 | 59380.61 |
| 2021-05 | 3670 | 28771.33 | 25878.61 | 54649.94 |
| 2021-06 | 1871 | 32794.82 | 27563.97 | 60358.79 |
| 2021-07 | 3670 | 30380.52 | 30440.34 | 60820.86 |
| 2021-08 | 2729 | 32588.25 | 27409.70 | 59997.95 |
| 2021-09 | 2729 | 33993.61 | 27454.88 | 61448.49 |
| 2021-10 | 2729 | 31623.98 | 27394.12 | 59018.10 |
| 2021-11 | 2729 | 27583.85 | 32724.24 | 60308.09 |
| 2021-12 | 2729 | 25785.88 | 35991.05 | 61776.93 |
该查询的年月维度显示正确(共36个月),但它汇总了每月所有客户的数据,并未筛选出每月最佳客户,这是我遇到的主要问题(此前的问题是无法将计费与非计费工时放在同一行)。
更新
在FanoFN的帮助下,我对查询进行了调整,解决了同一客户每月都被选为第一行的问题,确保每月TotalAmount最高的客户排在第一行:
WITH cte AS (SELECT DATE_FORMAT(DATE, '%Y-%m') AS "yearMonth", ClientId AS "Client ID", COUNT(DISTINCT EmployeeId) AS "Employees on account", SUM(CASE WHEN BillType = 'Billable' THEN Hours END) AS "Billable Hours", SUM(CASE WHEN BillType = 'NonBillable' THEN Hours END) AS "Non-Billable Hours", SUM(Hours) AS "Total Hours", SUM(TotalAmount) AS "Total Amount", ROW_NUMBER() OVER (PARTITION BY DATE_FORMAT(DATE, '%Y-%m') ORDER BY SUM(TotalAmount) DESC) AS RowNum FROM Towson GROUP BY yearMonth, ClientId ORDER BY yearMonth, TotalAmount) SELECT * FROM cte WHERE RowNum=1;
查询结果如下(仅展示前三个月):
| yearMonth | Client ID | Employees on account | Billable Hours | Non-Billable Hours | Total Hours | Total Amount | RowNum |
|---|---|---|---|---|---|---|---|
| 2019-01 | 1624 | 12 | 2241.00 | null | 2241.00 | 701093.4100 | 1 |
| 2019-02 | 1624 | 11 | 1627.25 | null | 1627.25 | 532556.7200 | 1 |
| 2019-03 | 3913 | 11 | 1417.50 | null | 1417.50 | 415419.5300 | 1 |
非计费工时显示为null是因为这些客户没有非计费工时(已在数据集中确认)。
内容的提问来源于stack exchange,提问作者SGT Mc Cool
相关产品推荐
相关产品推荐

