【问题标题】:SQL - Transpose different rows in columnsSQL - 转置列中的不同行
【发布时间】:2020-05-18 09:28:06
【问题描述】:

我有一个批量插入的表(我之前无法修改),我需要将“VALUES”列中的所有行转换为单列。除了“YEAR”(从 0 到 50)和“VALUES”列之外,其他 3 列都填充了唯一值(例如:在第 0 年,大小为“L”,颜色为“红色”,价格为'10',这个尺寸、颜色和价格值在我 50 年里都是不变的)。

输入表是这样的:

我希望将列中的所有“VALUES”作为输出,例如“VALUE_0”“VALUE_1”“VALUE_2”“VALUE_3”等,其中数字 0、1、2、3 代表所考虑的年份。

CREATE TABLE #CURVE(
    YEAR INT, 
    SIZE VARCHAR(100),
    COLOR VARCHAR(100),
    PRICE VARCHAR(100), 
    VALUES FLOAT
)

输出应该是:

【问题讨论】:

  • 你应该看看数据透视表..
  • 请仅标记单个 RDBMS,即 MySQL 或 SQL Server - 不能同时标记。
  • 您好 AbbaB,欢迎来到 Stack Overflow。请以表格文本的形式提供示例数据和预期结果。
  • 我已经删除了 MySQL 和 SQL Server - 请只添加相关的。

标签: sql group-by pivot


【解决方案1】:

一个选项使用条件聚合:

select 
    size,
    color, 
    price,
    max(case when year = 0 then value end) value_0,
    max(case when year = 1 then value end) value_1,
    max(case when year = 2 then value end) value_2,
    max(case when year = 3 then value end) value_3,
    max(case when year = 4 then value end) value_4,
    max(case when year = 5 then value end) value_5
from #curve
group by size, color, price

您可以轻松扩展select 子句以处理更多年份。

这是一个跨数据库解决方案,其性能通常与pivot 的供应商特定实现一样好或更好。最重要的是(以及它的价值),我发现它更容易理解。

【讨论】:

    【解决方案2】:

    我们需要知道您期望值列中一年有多少值? 否则查询如下所示:

    SELECT [YEAR], [SIZE], [COLOR], [PRICE], [1] as [Value1], [2] as [Value2], [3] as [Value3]
    FROM (
        SELECT *, ROW_NUMBER() OVER(PARTITION BY [YEAR], [SIZE], [COLOR], [PRICE] ORDER BY (SELECT NULL)) ID
        FROM #CURVE c
    ) t
    PIVOT(MAX([Value]) FOR ID IN ([1], [2], [3]])) p
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      相关资源
      最近更新 更多