2014-02-07 3 views
2

Я следующие таблицы в SQL Server 2008:SQL запросов к tranpose данных

ID Type Value 
6 A_Left A 
6 B_Left B 
6 C_Left C 
6 D_Left D 
6 E_Left E 
6 A_Right A 
6 B_Right B 
6 C_Right C 
6 D_Right D 
6 E_Right E 

И мне нужно, чтобы получить их, сгруппированных на основе столбца Value, как:

ID Type Type Value 
6 A_Left A_Right A 
6 B_Left B_Right B 
6 C_Left C_Right C 
6 D_Left D_Right D 
6 E_Left E_Right E 

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

+0

Вы можете выбрать два раза один и тот же стол, но для первых вы ГГЕТ только регистрам «Left» строка же для Правильно, тогда вы присоединяетесь к двум из них по значению, которое кажется таким же. –

+0

Похоже, я недавно ответил на этот вопрос. Возможно, посмотрите [этот вопрос] (http://stackoverflow.com/questions/21584468/mysql-row-as-a-column/21584589#21584589). – SebastianH

ответ

1

Используя INNER JOIN, присоединитесь к таблице против себя. С одной стороны соединения ограничьте соответствие тем, которые соответствуют _Left, а с другой стороны, ограничивают соответствие _Right.

SELECT 
    l.ID, 
    l.Type AS L_Type, 
    r.Type AS R_Type, 
    l.Value 
FROM 
    t l 
    INNER JOIN t r ON l.ID = r.ID AND l.Value = r.Value 
WHERE 
    RIGHT(l.type, 4) = 'Left' 
    AND RIGHT(r.type, 5) = 'Right' 

Вот демонстрация: http://sqlfiddle.com/#!6/f6590/4

В качестве альтернативы, вы можете использовать LIKE вместо функции RIGHT() строки:

SELECT 
    l.ID, 
    l.Type AS L_Type, 
    r.Type AS R_Type, 
    l.Value 
FROM 
    t l 
    INNER JOIN t r ON l.ID = r.ID AND l.Value = r.Value 
WHERE 
    l.type LIKE '%_Left' 
    AND r.type LIKE '%_Right' 

http://sqlfiddle.com/#!6/f6590/5

+1

Я бы использовал LIKE вместо функции RIGHT: http://sqlfiddle.com/#!3/8cc08/6, но с тех пор, как вы разместили сначала :) (нет необходимости в отдельном редактировании.) –

+1

@JorgeCampos Я просто делал второй скрипта с помощью 'LIKE'. –

+0

просто используйте этот, тогда :) –

1

Использование PATINDEX:

SELECT t1.ID, t1.Type As Type, t2.Type AS Type, t1.Value As Value 
FROM t as t1 JOIN t t2 ON t1.ID=t2.ID AND t1.Value=t2.Value 
WHERE PATINDEX('%_Left',t1.Type)>0 
AND PATINDEX('%_Right',t2.Type)>0 

Подобно выше, но с использованием CTE И Т.П. (PATINDEX Может также использоваться):

WITH CTE AS 
(
    Select ID,Type,Value FROM t WHERE Type LIKE '%_Left' 
) 

SELECT t1.ID,CTE.Type+ ',' + t1.Type As Type,t1.Value FROM CTE 
JOIN t t1 
ON t1.ID = CTE.ID AND t1.Value = CTE.Value 
WHERE t1.Type LIKE '%_Right' 
Смежные вопросы