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

jqjz2hbq  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(306)

我得到的数据如下:

╔═════════╦═════════╦═════════╦══════════════╦══════════════╦══════════════╗
║ 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

我不知道如何使最后三个百分比列值成为行值,部分原因是我不能有不同的数据类型,而且我不知道如何。
有什么建议吗?

mftmpeh8

mftmpeh81#

使用 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 支持标准的横向联接(即使不同数据库的语法不同)。他们是非常强大的,取消激励是一个很好的方式开始了解他们。

n3ipq98p

n3ipq98p2#

在sql server中使用一个称为 apply :

select x.*
from @tbl t
cross apply (values
    ('option1', t.option1, t.per_opt1),
    ('option2', t.option2, t.per_opt2),
    ('option3', t.option3, t.per_opt3)
) as x(options, vals, percentages)

db小提琴演示:

options | vals | percentages
:------ | ---: | ----------:
option1 |   10 |        0.67
option2 |    4 |        0.27
option3 |    1 |        0.07

请注意 values 是sql关键字-我将列重命名为 vals 在结果集中。

相关问题