从单元格值中引用不同表中的列并将其合并为一列

时间:2017-06-21 21:49:49

标签: sql sql-server tsql pivot sql-server-2014

我有一个像这样的表(Area_Data)...

Area1         Area2         Area3
9118890       9228834       9338890

Area1,2,3是列标题(为了便于讨论,我简化了Area_Data表,但它有12个区域列)

然后我有另一张桌子(Area_Offset)......

Name    Offset  Zone      
P5.3    -4      Area1
P3.3    -4      Area1
P3.4    -4      Area1
P5.4    -4      Area2
P61.1   -9      Area3
P5.1    -4      Area2
P3.1    -4      Area3

我正在尝试创建一个像

这样的表
Name    Offset  Zone      CalculatedOffset    Area
P5.3    -4      Area1    9118886             9118890       
P3.3    -4      Area1    9118886             9118890       
P3.4    -4      Area1    9118886             9118890       
P5.4    -4      Area2    9228830             9228834       
P61.1   -9      Area3    9338886             9338890
P5.1    -4      Area2    9228830             9228834       
P3.1    -4      Area3    9338886             9338890

(计算的偏移量并不重要我想如果我可以将相关的区域数据输入此表,我知道如何创建该列)

我应该怎么做才能实现这一目标? 我试过谷歌带我到一些资源提到枢轴我尝试了这个,但它没有结果正确

我试过的是......

SELECT *

  FROM Area_Offset,
        Area_Data
  PIVOT
  (
    MAX(Area1)
    FOR
        Area1 IN (Zone)
  ) AS p

然后是这次讨论TSQL Pivot without aggregate function,但我无法理解它。

2 个答案:

答案 0 :(得分:1)

您正在寻找unpivot而不是pivot。我喜欢使用outer apply

执行此操作
select ao.*, (v.area + ao.offset) as CalculatedOffset, v.zone as area
from area_data ad outer apply
     (values (area1, 'area1'), (area2, 'area2'), (area3, 'area3')
     ) v(area, zone) join
     area_offset ao
     on ao.zone = v.zone;

答案 1 :(得分:1)

使用Cross Apply我们也可以

Select 
TT.Name,
TT.Offset,
TT.Zone,  
CONVERT(INT,T.VAL)  - CONVERT(INT,REPLACE(TT.Offset,'-',''))    ,T.VAL 
from  ( 
select COL,VAL 
from @Table1
    CROSS APPLY (VALUES ('Area1',Area1),
                        ('Area2',Area2),
                        ('Area3',Area3))CS(COL,VAL))T
                        INNER JOIN  @Table2 TT
                        ON T.COL = TT.Zone