mysql - 找出每年每学期以美元计算的销售额最差和最好的产品
问题描述
我将表sales_by_year_semester
定义为
CREATE TABLE `sales_by_year_semester` (
`order_year` INT(4) NOT NULL,
`semester` TINYINT(1),
`year_semester` VARCHAR(6),
`productCode` VARCHAR(10),
`total_sales_in_usd` FLOAT
) ENGINE=InnoDB;
它有以下数据:
| order_year | semester | year_semester | productCode | total_sales_in_usd |
|------------|----------|---------------|-------------|--------------------|
| 2019 | 1 | 2019-1 | S32_2206 | 2025.16 |
| 2019 | 1 | 2019-1 | S24_2972 | 2285.76 |
| 2019 | 1 | 2019-1 | S18_3232 | 26052.88 |
| 2019 | 2 | 2019-2 | S24_1937 | 6770.34 |
| 2019 | 2 | 2019-2 | S24_2840 | 7159.86 |
| 2019 | 2 | 2019-2 | S12_1099 | 44466.99 |
| 2019 | 2 | 2019-2 | S10_1949 | 48878.16 |
| 2019 | 2 | 2019-2 | S18_3232 | 77427.42 |
| 2020 | 1 | 2020-1 | S24_1937 | 3903.19 |
| 2020 | 1 | 2020-1 | S24_2840 | 4470.39 |
| 2020 | 1 | 2020-1 | S10_4698 | 37297.31 |
| 2020 | 1 | 2020-1 | S12_1108 | 39203.54 |
| 2020 | 1 | 2020-1 | S18_3232 | 43418.87 |
| 2020 | 2 | 2020-2 | S24_3969 | 7907.94 |
| 2020 | 2 | 2020-2 | S24_1937 | 8303.47 |
| 2020 | 2 | 2020-2 | S12_1108 | 66283.92 |
| 2020 | 2 | 2020-2 | S18_3232 | 76962.53 |
| 2021 | 1 | 2021-1 | S24_3969 | 4235.98 |
| 2021 | 1 | 2021-1 | S24_1937 | 5660.64 |
| 2021 | 1 | 2021-1 | S10_4698 | 34856.12 |
| 2021 | 1 | 2021-1 | S18_3232 | 52978.28 |
我怎样才能获得以美元计销售额最少/最多的产品,它productCode
适用year_semester
于以下格式:
| order_year | semester | year_semester | productCode_least_sales | least_sales_in_usd | productCode_most_sales | most_sales_in_usd |
|------------|----------|---------------|-------------------------|--------------------|------------------------|-------------------|
| 2019 | 1 | 2019-1 | S32_2206 | 2025.16 | S18_3232 | 26052.88 |
| 2019 | 2 | 2019-2 | S24_1937 | 6770.34 | S18_3232 | 77427.42 |
| 2020 | 1 | 2020-1 | S24_1937 | 3903.19 | S18_3232 | 43418.87 |
| 2020 | 2 | 2020-2 | S24_3969 | 7907.94 | S18_3232 | 76962.53 |
| 2021 | 1 | 2021-1 | S24_3969 | 4235.98 | S18_3232 | 52978.28 |
我试图做的是使用 aCASE WHEN
来选择MIN(total_sales_in_usd)
,MAX(total_sales_in_usd)
但我无法获得productCode
每个值的对应值。
SELECT
order_year,
semester,
year_semester,
CASE WHEN
MIN(DISTINCT total_sales_in_usd) THEN productCode END
as productCode_least_sales,
MIN(total_sales_in_usd),
CASE WHEN
MAX(DISTINCT total_sales_in_usd) THEN productCode END as productCode_most_sales,
MAX(total_sales_in_usd)
FROM
sales_by_year_semester
GROUP BY
year_semester ;
解决方案
你可以这样做left join
。
select t1.*, minProduct.product_code, t2.minSales, maxProduct.product_code, t3.maxSales from
(select distinct order_year
, semester
, year_semester
from sales_by_year_semester) as t1
left join
(select order_year
, min(total_sales_in_usd) as minSales
from sales_by_year_semester group by order_year) as t2 on t2.order_year = t1.order_year
left join
(select order_year
, max(total_sales_in_usd) as maxSales
from sales_by_year_semester group by order_year, ) as t3 on t3.order_year = t1.order_year
left join
(select product_code, total_sales_in_usd, order_year
from sales_by_year_semester) as minProduct
on minProduct.total_sales_in_usd = t2.minSales and minProduct.order_year=t2.order_year
left join
(select product_code, total_sales_in_usd, order_year
from sales_by_year_semester) as maxProduct
on maxProduct.total_sales_in_usd = t3.maxSales and maxProduct.order_year=t2.order_year
推荐阅读
- javascript - Passing PHP JSON to Javascript gives "Malformed arrow function parameter list"
- python - 添加到 Python 路径 DLL
- r - 在R中,如何求和行之间的距离(每一行都是一个GPS坐标)?
- c - 闪存搜索字符串
- python - 如何将 aio-pika 与 FastAPI 一起使用?
- git - 如何在 Github Actions 中获取子模块的最新提交文件,以便在构建过程中使用它?
- java - 使用 OffsetDateTime 查询表时收到 IllegalArgumentException
- c# - RawGameController.GetCurrentReading 不更新 UWP 中的数组
- docker - Jenkins 管道无法登录到 docker hub
- css - Woocommerce + 金融问题