SQL-在列中转置不同的行

SQL-在列中转置不同的行,sql,group-by,pivot,Sql,Group By,Pivot,我有一个来自大容量插入的表(我以前不能修改它),我需要将“VALUES”列中的所有行转换为单个列。除了“年”(从0到50)和“值”列外,其他3列都用唯一的值填充(例如:在第0年中,大小为“L”,颜色为“红色”,价格为“10”,此大小、颜色和价格值在我的50年中都是不变的) 输入表如下所示: 我希望输出名为“VALUE_0”、“VALUE_1”、“VALUE_2”、“VALUE_3”等列中的所有“VALUE”,其中数字0,1,2,3代表所考虑的年份 CREATE TABLE #CURVE(

我有一个来自大容量插入的表(我以前不能修改它),我需要将“VALUES”列中的所有行转换为单个列。除了“年”(从0到50)和“值”列外,其他3列都用唯一的值填充(例如:在第0年中,大小为“L”,颜色为“红色”,价格为“10”,此大小、颜色和价格值在我的50年中都是不变的)

输入表如下所示:

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

CREATE TABLE #CURVE(
    YEAR INT, 
    SIZE VARCHAR(100),
    COLOR VARCHAR(100),
    PRICE VARCHAR(100), 
    VALUES FLOAT
)
输出应为:


我们需要知道您希望在“价值”列中一年有多少个价值? 否则,查询如下所示:

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

一个选项使用条件聚合:

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
实现一样好或更好。最重要的是,我发现它更容易理解。

您应该看看pivot表。请只标记一个RDBMS,即MySQL或SQL Server,而不是两者都标记。您好,AbbaB,欢迎使用Stack Overflow。请以表格形式提供示例数据和预期结果。我已经删除了MySQL和SQL Server-请只添加相关的一个。