sql-在列中转置不同的行

zour9fqk  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(337)

我有一个大容量插入的表(我以前不能修改它),我需要将“values”列中的所有行转换为单个列。除了“year”(从0到50)和“values”列之外,其他3列都用一个唯一的值填充(例如:在year 0中,size是“l”,color是“red”,price是“10”,这个size、color和price值在我的50年中都是不变的)。
输入表如下所示:

我想输出所有列中的“值”,例如“值0”“值1”“值2”“值3”等,其中数字0,1,2,3代表所考虑的年份。

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

输出应为:

6qftjkof

6qftjkof1#

一个选项使用条件聚合:

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 . 除此之外(不管它值多少钱),我发现它更容易理解。

wlwcrazw

wlwcrazw2#

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

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

相关问题