Как отключить три типа значений (включая заголовки столбцов) - PullRequest
2 голосов
/ 28 мая 2020

Данные, которые у меня есть, выглядят так:

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

Я не знаю, как получить эти последние три процентные значения столбцов должны быть значениями строк, частично потому, что у меня не может быть другого типа данных, и потому что я не знаю, как это сделать.

Есть предложения?

Ответы [ 2 ]

5 голосов
/ 28 мая 2020

Используйте 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 поддерживает боковые соединения, которые являются стандартными (даже если синтаксис зависит от базы данных). Они очень эффективны, и отключение разворота - хороший способ начать о них узнавать.

3 голосов
/ 28 мая 2020

Использовать боковое соединение SQL Сервер, это называется 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 Fiddle :

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

Обратите внимание, что values - это ключевое слово SQL - я переименовал столбец в vals в наборе результатов.

...