SQL Server-如何使用已取消透视的列值

时间:2018-09-20 12:22:45

标签: sql sql-server

如何使用已经取消透视到新表中的列值。 例如,我们有一个表,其中包含列名列表:[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
...    ...       ...

2 个答案:

答案 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);