题解 | #某店铺的各商品毛利率及店铺整体毛利率#

某店铺的各商品毛利率及店铺整体毛利率

http://www.nowcoder.com/practice/65de67f666414c0e8f9a34c08d4a8ba6

思路:

第一步: 查出来有用的信息

-- JOIN ...USING(字段) 代表内连接 using(字段) 代表使用这个 字段连接两个表
SELECT product_id, price, cnt, in_price
        FROM tb_order_detail
        JOIN tb_product_info USING(product_id)
        JOIN tb_order_overall USING(order_id)
        WHERE shop_id = 901 and DATE(event_time) >= "2021-10-01"

运行结果如下:

+------------+-------+-----+----------+
| product_id | price | cnt | in_price |
+------------+-------+-----+----------+
|       8001 |  8500 |   2 |     6000 |
|       8001 |  8500 |   1 |     6000 |
|       8003 | 18000 |   1 |    12000 |
+------------+-------+-----+----------+
3 rows in set (0.00 sec)

第二步: 使用 with rollup 计算总和

-- 总和计算出来在 profit_rate列显示,但是product_id 会为null,可以使用 ifnull() 函数,也可以使用 coalesce() 函数,将 product_id 填充
SELECT coalesce(product_id, '店铺汇总') as product_id,
        ROUND(100 * (1 - SUM(in_price*cnt) / SUM(price*cnt)), 1) as profit_rate
    FROM (
        SELECT product_id, price, cnt, in_price
        FROM tb_order_detail
        JOIN tb_product_info USING(product_id)
        JOIN tb_order_overall USING(order_id)
        WHERE shop_id = 901 and DATE(event_time) >= "2021-10-01"
    ) as t_product_in_each_order
    GROUP BY product_id
    WITH ROLLUP
    HAVING profit_rate > 24.9 OR product_id IS NULL
    ORDER BY product_id

运行结果:

+--------------+-------------+
| product_id   | profit_rate |
+--------------+-------------+
| 店铺汇总     |        31.0 |
| 8001         |        29.4 |
| 8003         |        33.3 |
+--------------+-------------+
3 rows in set, 2 warnings (0.00 sec)

第三步: 使用% 连接

SELECT product_id, CONCAT(profit_rate, "%") as profit_rate
FROM (
    SELECT coalesce(product_id, '店铺汇总') as product_id,
        ROUND(100 * (1 - SUM(in_price*cnt) / SUM(price*cnt)), 1) as profit_rate
    FROM (
        SELECT product_id, price, cnt, in_price
        FROM tb_order_detail
        JOIN tb_product_info USING(product_id)
        JOIN tb_order_overall USING(order_id)
        WHERE shop_id = 901 and DATE(event_time) >= "2021-10-01"
    ) as t_product_in_each_order
    GROUP BY product_id
    WITH ROLLUP
    HAVING profit_rate > 24.9 OR product_id IS NULL
    ORDER BY product_id
) as t1;
全部评论
你好,请问第一步和第二步合并写的话,我的ifnull函数没有效果是什么问题所在?
点赞 回复 分享
发布于 2022-04-02 16:44

相关推荐

找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务