SQL与包含维度的表连接

SQL与包含维度的表连接,sql,join,sql-server-2012,Sql,Join,Sql Server 2012,如何联接包含维度及其值的表1和表2,以获得以下结果: 更新 感谢您提出的支点方式。只是出于好奇-有可能通过几个左连接来解决它吗 更新2 我想和大家分享一下我的想法,用几个左连接来解决这个问题。它非常简单,比枢轴方式快得多。下面你可以找到我的答案 declare @table1 table ( id int, salary int ) insert into @table1 values (1, 1000), (2, 2000) declare @table2 table

如何联接包含维度及其值的表1和表2,以获得以下结果:

更新 感谢您提出的支点方式。只是出于好奇-有可能通过几个左连接来解决它吗

更新2 我想和大家分享一下我的想法,用几个左连接来解决这个问题。它非常简单,比枢轴方式快得多。下面你可以找到我的答案

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')
带透视的查询

SELECT t2.*, t1.salary
FROM
@table1 t1 
join 
    (SELECT * FROM @table2) AS SourceTable
    PIVOT
    (
        max(dimensionValue)
        FOR dimension IN ([eyes],[worker type],[sex])
    ) AS T2 
on T2.id = t1.id 
带透视的查询

SELECT t2.*, t1.salary
FROM
@table1 t1 
join 
    (SELECT * FROM @table2) AS SourceTable
    PIVOT
    (
        max(dimensionValue)
        FOR dimension IN ([eyes],[worker type],[sex])
    ) AS T2 
on T2.id = t1.id 
请尝试以下代码:

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
帮帮忙

请尝试以下代码:

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
帮帮忙

使用左连接:

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
必须提到每个维度的左连接

使用左连接:

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

必须提到每个维度的左连接

我的经验得出了这段代码,我想与大家分享。关键是每次进行左联接时,都要为维度表分配新的别名

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'

我的经验得出了这个代码,我想与大家分享。关键是每次进行左联接时,都要为维度表分配新的别名

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'

维度计数是可变的还是静态的?关键点是使用PIVOT和CTE。至于现在,我无法为您编写查询,但请阅读这两个功能。@tvelyky您所说的Dimansion count是什么意思?维度的数量是有限的,比如说3个维度,就像在这个例子中?维度计数是可变的还是静态的?kye点是使用PIVOT和CTE。至于现在,我无法为您编写查询,但请阅读这两个功能。@tvelyky您所说的Dimansion count是什么意思?维度的数量有限,比如本例中的3个维度?您有没有理由声明alias up?@PrzemyslawRemin,您需要在那里使用别名才能使用PIVOT或UNPIVOT语法:许多人养成了使用p或up或“pvt”的习惯,因为PIVOT语句正在使用它。您有什么理由声明alias up吗?@PrzemyslawRemin,您需要在那里使用别名才能使用PIVOT或UNPIVOT语法:许多人养成了使用p或up或“pvt”的习惯,因为PIVOT语句正在使用它。为什么使用maxdimensionValue?我的意思是为什么不仅仅是dimensionValue?聚合函数是PIVOT语法所必需的。由于dimensionValue是varchar,所以只有MAX或MIN可用,而不是SUM或AVG。如果表2中id和dimension的每个组合只有一行,那么MIN和MAX返回相同的结果为什么使用maxdimensionValue?我的意思是为什么不仅仅是dimensionValue?聚合函数是PIVOT语法所必需的。由于dimensionValue是varchar,所以只有MAX或MIN可用,而不是SUM或AVG。如果表2中id和dimension的每个组合只有一行,那么MIN和MAX返回相同的结果