SQL-在列中转置不同的行
我有一个来自大容量插入的表(我以前不能修改它),我需要将“VALUES”列中的所有行转换为单个列。除了“年”(从0到50)和“值”列外,其他3列都用唯一的值填充(例如:在第0年中,大小为“L”,颜色为“红色”,价格为“10”,此大小、颜色和价格值在我的50年中都是不变的) 输入表如下所示: 我希望输出名为“VALUE_0”、“VALUE_1”、“VALUE_2”、“VALUE_3”等列中的所有“VALUE”,其中数字0,1,2,3代表所考虑的年份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(
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-请只添加相关的一个。