Mysql 以美元计算,找出每年每学期销售最差和最好的产品

Mysql 以美元计算,找出每年每学期销售最差和最好的产品,mysql,Mysql,我将表sales\u按年份/学期定义为 创建表“按年份/学期列出的销售额”( `订单年份整(4)不为空, `第1学期, `第二学年学期'VARCHAR(6), `产品代码'VARCHAR(10), `总销售额(单位:美元)浮动 )引擎=InnoDB; 它有以下数据: | order_year | semester | year_semester | productCode | total_sales_in_usd | |------------|----------|-------------

我将表
sales\u按年份/学期定义为

创建表“按年份/学期列出的销售额”(
`订单年份整(4)不为空,
`第1学期,
`第二学年学期'VARCHAR(6),
`产品代码'VARCHAR(10),
`总销售额(单位:美元)浮动
)引擎=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
,格式如下:

| 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          |
我试图做的是在
选择
最小值(以美元表示的总销售额)
最大值(以美元表示的总销售额)
时使用一个
案例,但我无法获得每个值对应的
产品代码

选择
订购年份:,
学期
第二学年,
当
最小值(以美元表示的不同总销售额),然后产品代码结束
作为产品代码(至少)(销售),,
最小值(以美元表示的总销售额),
当
最大值(以美元表示的不同总销售额),然后productCode结束为productCode most销售额,
最大值(总销售额(单位:美元)
从…起
销售(按年度、学期)
分组
学年/学期;

您可以改为执行
左连接

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

对于这类问题,我喜欢使用
ROW\u NUMBER
。假设您使用的是MySQL 8+,我们可以尝试:

WITH cte AS (
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY year_semester ORDER BY total_sales_in_usd) rn_min,
        ROW_NUMBER() OVER (PARTITION BY year_semester ORDER BY total_sales_in_usd DESC) rn_max
    FROM sales_by_year_semester
)

SELECT
    order_year,
    semester,
    year_semester,
    MAX(CASE WHEN rn_min = 1 THEN productCode END) AS productCode_least_sales,
    MAX(CASE WHEN rn_min = 1 THEN total_sales_in_usd END) AS least_sales_in_usd,
    MAX(CASE WHEN rn_max = 1 THEN productCode END) AS productCode_most_sales,
    MAX(CASE WHEN rn_max = 1 THEN total_sales_in_usd END) AS most_sales_in_usd
FROM cte
GROUP BY
    order_year,
    semester,
    year_semester
ORDER BY
    order_year,
    semester,
    year_semester;

我想我是糊涂了。您想计算每个产品的
MAX
MIN
销售额吗?您想知道哪个产品的
MAX
,哪个产品的
MIN
?您想知道哪些产品的总销售额最大,哪些产品的总销售额最小吗?这是以美元计算还是以频率计算?我需要找到每个
年度
学期
销售额最少、销售额最多的
产品代码
,按计数还是按美元计算?按
总销售额(以美元计算)
顺便说一句,货币几乎从不浮动;这就是十进制被发明的原因!