我正在尝试将表格格式修改为新格式,这将有助于我在我正在开发的新.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
答案 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
是因为我假设可能并不总是有顶部,中部和底部记录。如果每种类型的匹配记录不止一个,您可能会得到一些重复的行,但这应该足以让您开始...