返回介绍

solution / 2200-2299 / 2252.Dynamic Pivoting of a Table / README

发布于 2024-06-17 01:03:08 字数 2627 浏览 0 评论 0 收藏 0

2252. 表的动态旋转

English Version

题目描述

表: Products

+-------------+---------+
| Column Name | Type  |
+-------------+---------+
| product_id  | int   |
| store     | varchar |
| price     | int   |
+-------------+---------+
(product_id, store) 是该表的主键(具有唯一值的列的组合)。
该表的每一行都表示商店中的 product_id 的价格。
表中最多有 30 个不同的商店 store。
price 就是这家店商品的价格。

 

重要提示:这个问题针对的是那些对 SQL 有丰富经验的人。如果你是初学者,我们建议你现在跳过它。

实现 PivotProducts 过程来重新组织 Products 表,以便每行都有一个商品的 id 及其在每个商店中的价格。如果商品不在商店出售,价格应为 null。表的列应该包含每个商店,并且它们应该按 字典顺序排序

过程应该在重新组织表之后返回它。

任意顺序 返回结果表。

返回结果格式如下所示。

 

示例 1:

输入: 
Products 表:
+------------+----------+-------+
| product_id | store  | price |
+------------+----------+-------+
| 1      | Shop   | 110   |
| 1      | LC_Store | 100   |
| 2      | Nozama   | 200   |
| 2      | Souq   | 190   |
| 3      | Shop   | 1000  |
| 3      | Souq   | 1900  |
+------------+----------+-------+
输出: 
+------------+----------+--------+------+------+
| product_id | LC_Store | Nozama | Shop | Souq |
+------------+----------+--------+------+------+
| 1      | 100    | null   | 110  | null |
| 2      | null   | 200  | null | 190  |
| 3      | null   | null   | 1000 | 1900 |
+------------+----------+--------+------+------+
解释: 
有 4 个商店: Shop, LC_Store, Nozama, Souq。 我们首先按字典顺序排列: LC_Store, Nozama, Shop, Souq.
现在, 对于商品 1, LC_Store 的价格是 100,Shop 的价格是 110。另外两个商店没有该商品销售,因此我们将价格设置为 null。
同样, 商品 2 在 Nozama 中的价格是 200,Souq 中的价格是 190。其他两家店都不卖。
商品 3, Shop 中的价格是 1000,Souq 中的价格是1900。其他两家店都不卖。

解法

方法一

CREATE PROCEDURE PivotProducts()
BEGIN
  # Write your MySQL query statement below.
  SET group_concat_max_len = 5000;
  SELECT GROUP_CONCAT(DISTINCT 'MAX(CASE WHEN store = \'',
         store,
         '\' THEN price ELSE NULL END) AS ',
         store
         ORDER BY store) INTO @sql
  FROM Products;
  SET @sql =  CONCAT('SELECT product_id, ',
          @sql,
          ' FROM Products GROUP BY product_id');
  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文