如何使用已经取消透视到新表中的列值。
例如,我们有一个表,其中包含列名列表:[ID]
,[Name]
,[Country]
,[PostCode]
,[Address]
。
我拥有的代码(注意:转换是出于联合目的,具有唯一的类型)
SELECT
ID,
FieldName,
FieldValue
FROM (SELECT
CONVERT(VARCHAR(100), [ID]) AS [ID],
CONVERT(VARCHAR(100), [Name]) AS [Name],
CONVERT(VARCHAR(100), [Country]) AS [Country],
CONVERT(VARCHAR(100), [PostCode]) AS [PostCode],
CONVERT(VARCHAR(100), [Address]) AS [Address]
FROM table) pv
UNPIVOT
(FieldValue FOR FieldName IN ([ID], [Name], [Country]
[PostCode], [Address])) unp
但是上面的代码将导致以下问题
无效的列名“ ID”。
是否有任何方法可以将ID包含为列名,并将所有ID值包含为[ID]列中的值列表?
例如, 我们有一个原始表
ID Name Country PostCode Address
1 Jack Australia 1234 Wyard
2 John China 3223 Belconnen
3 Ed UK 1123 Rose
我希望表格如下所示
ID FieldName FieldValue
1 ID 1
1 Name Jack
1 Country Australia
1 PostCode 1234
1 Address Wyard
2 ID 2
2 Name Leo
... ... ...
答案 0 :(得分:2)
您可以在嵌套查询中使用带有其他别名的ID创建另一列,并且不要在未透视列的列表中引用它。
SELECT
ID_C AS [ID],
FieldName,
FieldValue
FROM (SELECT
CONVERT(VARCHAR(100), [ID]) AS [ID_C],
CONVERT(VARCHAR(100), [ID]) AS [ID],
CONVERT(VARCHAR(100), [Name]) AS [Name],
CONVERT(VARCHAR(100), [Country]) AS [Country],
CONVERT(VARCHAR(100), [PostCode]) AS [PostCode],
CONVERT(VARCHAR(100), [Address]) AS [Address]
FROM table) pv
UNPIVOT
(FieldValue FOR FieldName IN ([ID], [Name], [Country]
[PostCode], [Address])) unp
这将需要在当前查询中进行很少的更改
答案 1 :(得分:1)
我建议为此使用apply
:
SELECT t.ID, v.FieldName, v.FieldValue
FROM table t CROSS APPLY
(VALUES (CONVERT(VARCHAR(100), [ID]), 'ID'),
(CONVERT(VARCHAR(100), [Name]), 'Name'),
(CONVERT(VARCHAR(100), [Country]), 'Country'),
(CONVERT(VARCHAR(100), [PostCode]), 'PostCode'),
(CONVERT(VARCHAR(100), [Address]), 'Address')
) v(FieldValue, FieldName);