2015-02-06 3 views
1

Как присоединиться table1 и таблица2 (содержащие размеры и их значения), чтобы получить следующие результаты: enter image description hereSQL соединяется с таблицами, которые содержат размеры

Update Благодарим Вас за предлагая путь с PIVOT. Просто для любопытства - можно ли решить его несколькими левыми объединениями?

Обновление 2 Я хотел бы поделиться с вами своей идеей решения проблемы несколькими левыми соединениями. Это очень просто и намного быстрее, чем Pivot. Ниже вы можете найти мой ответ.

+0

Величина измерения является переменным или статическим числом? –

+0

Ключевым моментом является использование PIVOT и CTE. На данный момент я не могу написать запрос для вас, но, пожалуйста, прочитайте об этих двух функциях. – sdrzymala

+0

@tvelykyy Что вы имеете в виду под номером Dimansion? Существует ограниченное количество измерений, скажем, 3 из них, как в этом примере? –

ответ

0

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

SELECT 
    T1.ID 
    ,S.DimensionValue AS Sex 
    ,E.DimensionValue AS Eyes 
    ,WT.DimensionValue AS [Worker Type] 
FROM #Table1 AS T1 

LEFT JOIN #Table2 AS S -- new alias here for dimension table 
ON T1.ID=S.ID AND S.Dimension='sex' 
LEFT JOIN #Table2 AS E -- new alias here for dimension table 
ON T1.ID=E.ID AND E.Dimension='eyes' 
LEFT JOIN #Table2 AS WT -- new alias here for dimension table 
ON T1.ID=WT.ID AND WT.Dimension='worker type' 
3
declare @table1 table 
(
    id int, 
    salary int 
) 

insert into @table1 
values 
(1, 1000), 
(2, 2000) 

declare @table2 table 
(
    id int, 
    dimension varchar(1000), 
    dimensionValue varchar(1000) 
) 

insert into @table2 
values 
(1, 'eyes','blue'), 
(1, 'sex','male'), 
(1, 'worker type','marvelous'), 
(2, 'eyes','brown'), 
(2, 'sex', 'female'), 
(2, 'worker type','spectacular') 

запрос с шарниром

+0

Почему используется 'max (dimensionValue)'? Я имею в виду, почему не просто «dimensionValue»? –

+1

Агрегатная функция требуется синтаксису PIVOT. и поскольку dimensionValue является varchar, доступны только MAX или MIN (не SUM или AVG). если в таблице 2 есть только одна строка для каждой комбинации id и измерения, MIN и MAX возвращают тот же результат – ASh

2

Попробуйте ниже код:

WITH PivotTable2 AS 
(
    SELECT ID, SEX, EYES, [WORKER TYPE] 
    FROM (
    SELECT ID, DIMENSION, [DIMENSION VALUE] 
    FROM Table2) up 
    PIVOT (MAX([DIMENSION VALUE]) FOR DIMENSION IN (SEX, EYES, [WORKER TYPE])) AS pvt 
) 
SELECT T1.ID,T1.Salary,T2.SEX,T2.EYES,T2.[WORKER TYPE] 
FROM Table1 AS T1 
LEFT JOIN PivotTable2 T2 ON T1.ID=T2.ID 

Hoep это Виль помочь!

+0

Есть ли причина, по которой вы объявили псевдоним 'up'? –

+2

@PrzemyslawRemin, вы должны использовать псевдоним, чтобы заставить синтаксис 'PIVOT' или' UNPIVOT' работать: многие люди развивают привычку использовать 'p' или' up' или 'pvt', так как он используется заявление PIVOT. – AHiggins

1

с помощью левой присоединяется:

CREATE TABLE #Table1 
(
    ID int, 
    Salary int 
) 

INSERT INTO #Table1 
VALUES 
(1, 1000), 
(2, 2000) 

CREATE TABLE #Table2 
(
    ID int, 
    Dimension varchar(1000), 
    DimensionValue varchar(1000) 
) 

INSERT INTO #Table2 
VALUES 
(1, 'eyes','blue'), 
(1, 'sex','male'), 
(1, 'worker type','marvelous'), 
(2, 'eyes','brown'), 
(2, 'sex', 'female'), 
(2, 'worker type','spectacular') 


SELECT T1.ID,S.Sex,E.Eyes,WT.[Worker Type] 
FROM #Table1 AS T1 
LEFT JOIN 
( SELECT ID, 
      DimensionValue AS Sex 
    FROM #Table2 
    WHERE Dimension='sex' 
) S ON T1.ID=S.ID 
LEFT JOIN 
( SELECT ID, 
      DimensionValue AS Eyes 
    FROM #Table2 
    WHERE Dimension='eyes' 
) E ON T1.ID=E.ID 
LEFT JOIN 
( SELECT ID, 
      DimensionValue AS [Worker Type] 
    FROM #Table2 
    WHERE Dimension='worker type' 
) WT ON T1.ID=WT.ID 

DROP TABLE #Table1,#Table2 

должен упомянуть левое соединение для каждого измерения .. !!