返回介绍

solution / 2200-2299 / 2253.Dynamic Unpivoting of a Table / README

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

2253. 动态取消表的旋转

English Version

题目描述

表: Products

+-------------+---------+
| Column Name | Type  |
+-------------+---------+
| product_id  | int   |
| store_name1 | int   |
| store_name2 | int   |
|    :    | int   |
|    :    | int   |
|    :    | int   |
| store_namen | int   |
+-------------+---------+
product_id 是该表的主键。
该表中的每一行都表示该商品在 n 个不同商店中的价格。
如果商店中没有该商品,则该商店列中的价格将为 null。
不同测试用例的商店名称可能会不同。至少有1家店,最多30家店。

 

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

实现 UnpivotProducts 过程来重新组织 Products 表,使每一行都有一个产品的 id、销售该商品的商店名称以及该商品在该商店中的价格。如果某个商品在某个商店中不可用,则不要在结果表中包含该 product_idstore 组合的行。结果应该有三列:product_idstoreprice

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

任意顺序 返回结果表。

查询结果格式如下所示。

 

示例 1:

输入: 
Products 表:
+------------+----------+--------+------+------+
| product_id | LC_Store | Nozama | Shop | Souq |
+------------+----------+--------+------+------+
| 1      | 100    | null   | 110  | null |
| 2      | null   | 200  | null | 190  |
| 3      | null   | null   | 1000 | 1900 |
+------------+----------+--------+------+------+
输出: 
+------------+----------+-------+
| product_id | store  | price |
+------------+----------+-------+
| 1      | LC_Store | 100   |
| 1      | Shop   | 110   |
| 2      | Nozama   | 200   |
| 2      | Souq   | 190   |
| 3      | Shop   | 1000  |
| 3      | Souq   | 1900  |
+------------+----------+-------+
解释: 
商品 1 在 LC_Store 和 Shop 销售,价格分别为 100 和 110。
商品 2 在 Nozama 和 Souq 销售,价格分别为 200 和 190。
商品 3 在 Shop 和 Souq 出售,价格分别为 1000 和 1900。

解法

方法一

CREATE PROCEDURE UnpivotProducts()
BEGIN
  # Write your MySQL query statement below.
  SET group_concat_max_len = 5000;
  WITH
    t AS (
      SELECT column_name
      FROM information_schema.columns
      WHERE
        table_schema = DATABASE()
        AND table_name = 'Products'
        AND column_name != 'product_id'
    )
  SELECT
    GROUP_CONCAT(
      'SELECT product_id, \'',
      column_name,
      '\' store, ',
      column_name,
      ' price FROM Products WHERE ',
      column_name,
      ' IS NOT NULL' SEPARATOR ' UNION '
    ) INTO @sql from t;
  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END;

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

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

发布评论

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