组合多行以创建具有相同ID的新行

时间:2015-06-22 15:38:28

标签: sql sql-server

我正在尝试将表格格式修改为新格式,这将有助于我在我正在开发的新.Net应用程序中。变化很简单,但我无法解决。

以下是当前格式的示例:

 RecoNumber   Position  Type            Length     

 NO VON-01    Top       Spiralbelt      44.27274    
 NO VON-01    Bottom    Venta Trac      13.10656    
 ACMHAPA-01   Top       Rhino Hyde-B    28.12       
 ACMHAPA-01   Lagging   OPL-35          0           
 ADVGRMI-01   Top       Spirabelt 1.05  35.40905    
 ADVGRMI-01   Bottom    Venta Trac-B    13.05474    
 ADVGRMI-01   Lagging   BMD-6           0           

以下是格式应该如何进行的示例:

RecoNumber   TopType         BtmType       LaggingType   TopLength   BtmLength   LaggingLength   

NO VON-01    Spiralbelt      Venta Trac    NULL          44.27274    13.10656    NULL
ACMHAPA-01   Rhino Hyde-B    NULL          OPL-35        28.12       NULL        0
ADVGRMI-01   Spirabelt 1.05  Venta Trac-B  BMD-6         35.40905    13.05474    0

我尝试过使用Group By或Row_Number()函数来合并但我无法使其工作。我到目前为止最接近的尝试是隔离每个单元格,但我无法将它们全部合并为一行。

这是我到目前为止的地方:

SELECT  RecoNumber,
        CASE WHEN (Position = 'Top') THEN Type ELSE NULL END as TopType,
        CASE WHEN (Position = 'Top') THEN Length ELSE NULL END as TopLength,
        CASE WHEN (Position = 'Bottom') THEN Type ELSE NULL END as BtmType,
        CASE WHEN (Position = 'Bottom') THEN Length ELSE NULL END as BtmLength,
        CASE WHEN (Position = 'Lagging') THEN Type ELSE NULL END AS LaggingType,
        CASE WHEN (Position = 'Lagging') THEN Length ELSE NULL END as LaggingLength
FROM Workbook2014_Test.dbo.RecoBeltsOld

result:

RecoNumber  TopType        TopLength  BtmType      BtmLength    LaggingType    LaggingLength

NO VON-01   Spiralbelt     44.27274   NULL         NULL         NULL           NULL
NO VON-01   NULL           NULL       Venta Trac   13.10656     NULL           NULL
ACMHAPA-01  Rhino Hyde-B   28.12      NULL         NULL         NULL           NULL
ACMHAPA-01  NULL           NULL       NULL         NULL OPL-35  0
ADVGRMI-01  Spirabelt 1.05 35.40905   NULL         NULL         NULL           NULL
ADVGRMI-01  NULL           NULL       Venta Trac-B 13.05474     NULL           NULL
ADVGRMI-01  NULL           NULL       NULL         NULL         BMD-6          0

感谢任何提示,Simon

2 个答案:

答案 0 :(得分:7)

您可以使用group by将它们全部放在同一RecoNumber行。

SELECT  RecoNumber,
        max(CASE WHEN (Position = 'Top') THEN Type ELSE NULL END) as TopType,
        max(CASE WHEN (Position = 'Top') THEN Length ELSE NULL END) as TopLength,
        max(CASE WHEN (Position = 'Bottom') THEN Type ELSE NULL END) as BtmType,
        max(CASE WHEN (Position = 'Bottom') THEN Length ELSE NULL END) as BtmLength,
        max(CASE WHEN (Position = 'Lagging') THEN Type ELSE NULL END) AS LaggingType,
        max(CASE WHEN (Position = 'Lagging') THEN Length ELSE NULL END) as LaggingLength
FROM Workbook2014_Test.dbo.RecoBeltsOld
group by RecoNumber

答案 1 :(得分:0)

你需要一个自我加入,包括:

SELECT isnull(T1.RecoNumber, isnull(T2.RecoNumber, T3.RecoNumber)) AS RecoNumber, 
       T1.Type AS TopType,
       T2.Type AS BtmType, 
       T3.Type AS LaggingType,
       T1.Length AS TopLength,
       T2.Length as BtmLength, 
       T3.Type AS LaggingType
FROM   RecoBeltsOld AS T1
       FULL JOIN RecoBeltsOld AS T2 ON T2.RecoNumber = T1.RecoNumber
       FULL JOIN RecoBeltsOld AS T3 ON T3.RecoNumber = isnull(T1.RecoNumber, T2.RecoNumber)
WHERE  T1.Position = 'Top'
       AND T2.Position = 'Bottom'
       AND T3.Position = 'Lagging'

FULL JOIN是因为我假设可能并不总是有顶部,中部和底部记录。如果每种类型的匹配记录不止一个,您可能会得到一些重复的行,但这应该足以让您开始...