【问题标题】:Reference Columns in diffrent table in from cell values and merge resulst into one column从单元格值中引用不同表格中的列并将结果合并到一列中
【发布时间】:2017-11-24 23:47:00
【问题描述】:

我有一个像这样的表(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

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

我应该怎么做才能做到这一点? 我尝试了 google 让我找到了一些提到 Pivot 的资源 我尝试了这个,但结果并不正确

我尝试的是......

SELECT *

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

然后是TSQL Pivot without aggregate function 的讨论,但我无法将它弄得太好。

【问题讨论】:

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


    【解决方案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;
    

    【讨论】:

    • 感谢您将我指向 unpivot,我设法让它与 unpivot 一起工作。今天晚些时候我将尝试让它与外部应用一起使用
    【解决方案2】:

    我们也可以使用 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
    

    【讨论】:

    • @daeden 请看一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 2019-08-02
    • 2016-01-08
    相关资源
    最近更新 更多