Есть несколько способов, которые вы можете получить результат, так как вы используете SQL Server. Чтобы получить результат, вам сначала нужно создать уникальное значение, которое позволит вам возвращать несколько строк для каждого Test
. Я хотел бы применить функцию кадрирования, как row_number()
:
select test, value, shape,
row_number() over(partition by test
order by value) seq
from yourtable
Этот запрос будет использоваться в качестве основы для остальной части процесса. Это создает уникальную последовательность для каждого test
, а затем, когда вы применяете агрегированную функцию, вы можете возвращать несколько строк.
Вы можете получить окончательный результат с помощью агрегатной функции с помощью выражения CASE-:
select
max(case when test = 1 then value end) test1Value,
max(case when test = 1 then shape end) test1Shape,
max(case when test = 2 then value end) test2Value,
max(case when test = 2 then shape end) test2Shape
from
(
select test, value, shape,
row_number() over(partition by test
order by value) seq
from yourtable
) d
group by seq;
См SQL Fiddle with Demo.
Если вы хотите реализовать функцию PIVOT, то сначала мне нужно будет отключить несколько столбцов Value
и Shape
, а затем применить PIVOT. Вы по-прежнему будете использовать row_number()
для генерации уникальной последовательности, которая понадобится для возврата нескольких строк. Базовый синтаксис будет:
;with cte as
(
-- get unique sequence
select test, value, shape,
row_number() over(partition by test
order by value) seq
from yourtable
)
select test1Value, test1Shape,
test2Value, test2Shape
from
(
-- unpivot the multiple columns
select t.seq,
col = 'test'+cast(test as varchar(10))
+ col,
val
from cte t
cross apply
(
select 'value', value union all
select 'shape', cast(shape as varchar(10))
) c (col, val)
) d
pivot
(
max(val)
for col in (test1Value, test1Shape,
test2Value, test2Shape)
) piv;
См SQL Fiddle with Demo. Обе версии дают результат:
| TEST1VALUE | TEST1SHAPE | TEST2VALUE | TEST2SHAPE |
|------------|------------|------------|------------|
| 1,89 | 20 | 2,01 | 12 |
| 2,05 | 12 | 2,03 | 24 |
| 2,08 | 27 | 2,05 | 35 |
Это логика отображения, а не логика базы данных – Jamiec