2014-01-28 4 views
-3

У меня есть таблица с этой структурой:Результаты Группировка по испытанию

Test Value Shape 

1  1,89 20 
1  2,08 27 
1  2,05 12 
2  2,01 12 
2  2,05 35 
2  2,03 24 

мне нужен столбец для каждого значения теста, в этом случае, что-то вроде этого:

Test 1   | Test 2 

Value | Shape | Value | Shape 

Я пытался сделать это с точкой опоры, но результаты были неудачными. Кто-нибудь может мне помочь?

[] s

+0

Это логика отображения, а не логика базы данных – Jamiec

ответ

2

Есть несколько способов, которые вы можете получить результат, так как вы используете 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 | 
+0

Спасибо человеку. Это сработало очень хорошо! – RafaelP

Смежные вопросы