gpt4 book ai didi

sql - 如何取消透视三种类型的值(包括列标题)

转载 作者:行者123 更新时间:2023-12-02 07:57:24 27 4
gpt4 key购买 nike

我的数据是这样的:

╔═════════╦═════════╦═════════╦══════════════╦══════════════╦══════════════╗
║ option1 ║ option2 ║ option3 ║ percent_opt1 ║ percent_opt2 ║ percent_opt3 ║
╠═════════╬═════════╬═════════╬══════════════╬══════════════╬══════════════╣
║ 10 ║ 4 ║ 1 ║ 0.67 ║ 0.27 ║ 0.07 ║
╚═════════╩═════════╩═════════╩══════════════╩══════════════╩══════════════╝

因此,如果我想将前三个列标题设为行值,然后将其他列设为更多行值,我该怎么做?

这就是我的意思:

╔═════════╦════════╦═════════════╗
║ options ║ values ║ percentages ║
╠═════════╬════════╬═════════════╣
║ option1 ║ 10 ║ 0.67 ║
╠═════════╬════════╬═════════════╣
║ option2 ║ 4 ║ 0.27 ║
╠═════════╬════════╬═════════════╣
║ option3 ║ 1 ║ 0.07 ║
╚═════════╩════════╩═════════════╝

这是我使用的代码:

declare @tbl as table (
option1 numeric(18,0),
option2 numeric(18,0),
option3 numeric(18,0),
per_opt1 numeric(18,2),
per_opt2 numeric(18,2),
per_opt3 numeric(18,2)
)

insert into @tbl
values (10,4,1,0.67,0.27,0.07)

;

select * from
(
select t.[option1],t.[option2],t.[option3]
from @tbl as t
) as srctbl
unpivot (
val for options in (option1,option2,option3)
) as unpiv

我不知道如何将最后三个百分比的列值设为行值,部分原因是我不能拥有不同的数据类型,而且我不确定如何去做。

有什么建议吗?

最佳答案

使用应用:

select v.*
from @tbl t cross apply
(values ('option1', option1, percent_opt1),
('option2', option2, percent_opt2),
('option3', option3, percent_opt3)
) v(option, value, percent_opt);

注意:values 是 SQL 关键字,因此我更改了中间列的名称。

在我看来,没有任何理由去学习unpivot。它是定制功能——少量数据库中的扩展——以“好的”方式只做一件事。

另一方面,apply 支持横向连接,这是标准的(即使语法因数据库而异)。它们非常强大,unpivoting 是开始了解它们的好方法。

关于sql - 如何取消透视三种类型的值(包括列标题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62074175/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com