2017-09-29 29 views
2

我有一个表具有以下数据SQL Server的多支点

+-----------+-----------+----------+----------+--------+ 
| SourceZip | TargetZip | TargetID | Distance | rowNum | 
+-----------+-----------+----------+----------+--------+ 
|  00602 |  08831 | 14780 | 1567.579 | R1  | 
|  00602 |  08831 |  6398 | 1567.579 | R2  | 
|  00602 |  07747 |  4290 | 1570.665 | R3  | 
|  00603 |  08831 | 14780 | 1561.272 | R1  | 
|  00603 |  08831 |  6398 | 1561.272 | R2  | 
|  00603 |  07747 |  4290 | 1564.328 | R3  | 
+-----------+-----------+----------+----------+--------+ 

我需要这个以下列格式

+-----------+-------------+-------------+-------------+-------------+-------------+-------------+ 
| SourceZip | R1_TargetID | R1_Distance | R2_TargetID | R2_Distance | R3_TargetID | R3_Distance | 
+-----------+-------------+-------------+-------------+-------------+-------------+-------------+ 
|  00602 |  14780 | 1567.579 |  6398 | 1567.579 |  4290 | 1570.665 | 
|  00603 |  14780 | 1561.272 |  6398 | 1561.272 |  4290 | 1564.328 | 
+-----------+-------------+-------------+-------------+-------------+-------------+-------------+ 

有人告诉我,我可以用一个支点此,但是我可以找到的每个示例主轴都使用一个聚合函数,并且只为旋转数据生成一列。

这是我可以做一个单一的枢纽,或者我需要生成2个单独的数据透视表(TargetID和距离各一个),然后加入他们吗?

UPDATE

我结束了该数据被传递,我需要为一个值的字段,可以在应用程序中解析出结合到

select * 
from (SELECT SourceZip, CONVERT(varchar(10), TargetID)+ '|' + CONVERT(varchar(10), Distance) as TargetSite, rowNum 
     FROM Targets 
    ) as SourceTable 

pivot (min(TargetSite) 
for rowNum in (R1 
       ,R2 
       ,R3 
       ) 
    ) as pivottable 

它的效果并不理想,但它的作品。

我仍然欣赏了多列旋转任何建议

回答

2

如果它可能转换枢转到同一类型的列,你可以使用这种方法。

DECLARE @MyTable TABLE (SourceZip VARCHAR(10), TargetZip VARCHAR(10),TargetID INT, Distance VARCHAR(10), rowNum VARCHAR(10)) 

INSERT INTO @MyTable VALUES 
('00602','08831','14780','1567.579','R1'), 
('00602','08831','6398','1567.579','R2'), 
('00602','07747','4290','1570.665','R3'), 
('00603','08831','14780','1561.272','R1'), 
('00603','08831','6398','1561.272','R2'), 
('00603','07747','4290','1564.328','R3') 

SELECT * FROM 
    (
     SELECT SourceZip, 
      CONVERT(VARCHAR(20),TargetID) [TargetID_Distance], 
      rowNum + '_TargetID' rowNum 
      FROM @MyTable 
     UNION ALL 
     SELECT SourceZip, 
      CONVERT(VARCHAR(20),Distance) [TargetID_Distance], 
      rowNum + '_Distance' rowNum 
     FROM @MyTable 
    ) SRC 
    PIVOT (MAX([TargetID_Distance]) 
      FOR rowNum IN ([R1_TargetID], 
          [R1_Distance], 
          [R2_TargetID], 
          [R2_Distance], 
          [R3_TargetID], 
          [R3_Distance])) PVT 

结果:

SourceZip R1_TargetID   R1_Distance   R2_TargetID   R2_Distance   R3_TargetID   R3_Distance 
---------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- 
00602  14780    1567.579    6398     1567.579    4290     1570.665 
00603  14780    1561.272    6398     1561.272    4290     1564.328 
+0

谢谢,这是做到了。我最终把它们都当成了花车而不是变种,而且它像一个魅力一样工作。 – Broom

1

所以,你要每SourceZip一行:

... 
GROUP BY SourceZip; 

现在,你想R1_TargetID柱:

SELECT 
    SUM(CASE WHEN rowNum = 'R1' THEN TargetID END) R1_TargetID, 

casenull替换不是rowNum = 'R1'的所有内容(由于暗含的else null条款)。 sum将忽略null。只要只有一行有rowNum = 'R1',它将与原始值的结果相同。

其他列同样可以做到:

SUM(CASE WHEN rowNum = 'R1' THEN Distance END) R1_Distance 
... 

更多关于这项技术:http://modern-sql.com/use-case/pivot

+0

upvoted的方法和优秀的资源链接。谢谢你教我一些新东西,即使我最终没有使用这种方法 – Broom