2015-06-17 4 views
0

Если у меня есть таблица со следующей структуройПреобразование таблицу SQL с помощью UNPIVOT

ID ИМЯ А1 А2 А3 В1 В2 В3

X ---- Y ------ 0- --1 --- 2 --- 3 --- 4 --- 5 (тир просто нажать значения под заголовками)

Как преобразовать его быть следующий:

ID NAME ПИСЬМО 1 2 3

X ---- Y ---------- A ------ 0-1-2

X --- Y ---------- -В ----- 3-4-5

ответ

0
SELECT id, name, 'A' letter, a1 1, a2 2, a3 3 from example_table 
UNION 
SELECT id, name, 'B' letter, b1 1, b2 2, b3 3 from example_table 

Я не уверен, что 1,2,3 будет работать в качестве имен столбцов; которые могут быть зависимыми от РСУБД.

+0

Я не планирую использовать 1 2 3, сейчас они просто имена примеров. Я буду бросать свои настоящие имена столбцов на моем конце :) Нет ли способа сделать это более в общем? Получение имен столбцов из Sys cols или что-то еще? Я должен жестко закодировать каждый в утверждение союза ...? – LaurAchnid

+0

Это звучит как новый вопрос для меня. В этом вопросе я (или ответчик с моим общим уровнем знаний) должен знать, какие РСУБД вы используете, и увидеть примеры нескольких экземпляров, которые вы хотите обобщить для своей процедуры. –

+0

Также возможно уместно, связаны ли вы с чистым SQL или можете использовать процедурный язык (PL/SQL, TSQL и т. Д.) Для вашего проекта. –

0

Хотя я не считаю это возможным ответом, он может дать вам о чем подумать, поскольку он дает конечный результат в sql-сервере.

SELECT 
    upvt.id 
    , upvt.name 
    , left(label,1) AS letter 
    , CASE 
     WHEN left(label,1) = 'A' THEN MIN(value) 
     WHEN left(label,1) = 'B' THEN MAX(value) 
     END AS [1] 
    , CASE 
     WHEN left(label,1) = 'A' THEN MIN(value1) 
     WHEN left(label,1) = 'B' THEN MAX(value1) 
     END AS [2] 
    , CASE 
     WHEN left(label,1) = 'A' THEN MIN(value2) 
     WHEN left(label,1) = 'B' THEN MAX(value2) 
     END AS [3] 
FROM example_table 
UNPIVOT (
    value 
    FOR label IN (a1,b1) 
    ) upvt 
INNER JOIN (
      SELECT 
       id 
       , name 
       , left(label1,1) AS letter 
       , value1 
      FROM example_table 
      UNPIVOT (
       value1 
       FOR label1 IN (a2,b2) 
       ) upvt1) as b 
    ON upvt.id = b.id 
    AND upvt.name = b.name 
INNER JOIN (
      SELECT 
       id 
       , name 
       , left(label2,1) AS letter 
       , value2 
      FROM example_table 
      UNPIVOT (
       value2 
       FOR label2 IN (a3,b3) 
       ) upvt2) c 
    ON upvt.id = c.id 
    AND upvt.name = c.name 
group by upvt.id, upvt.name, upvt.label 

Не совсем то, что я назвал бы «готовой продукцией».