我的数据如下所示:
╔═════════╦═════════╦═════════╦══════════════╦══════════════╦══════════════╗
║ 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
我不知道如何使最后三个百分比列值成为行值,部分原因是因为我无法使用其他数据类型,并且因为我不确定如何做到这一点。
有什么建议?
用途apply
:
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
支持横向连接,这是标准的(即使语法在数据库之间有所不同)。它们非常强大,并且毫不动摇是开始学习它们的好方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句