我有一个返回单行数据的查询。假设它看起来像这样(带有列标题)。
Fruit | Veg | Meats | Nuts |
----------------------------------------
Apple Lettuce Veal Almond
而不是这个,我想将此单行作为两列表返回,列/字段名称在最左边的列中。像这样:
FieldName | Value |
-----------------------
Fruit Apple
Veg Lettuce
Meats Veal
Nuts Almond
似乎应该有一些非痛苦的方式来实现这一点,但如果有的话,我似乎找不到它。撞到一堵砖墙。这甚至可能吗?
非常感谢您的任何意见。
编辑: 查询返回的结果不是静态的,所以我将无法明确定义列标题。
编辑 2: 我正在尝试让其中一些建议发挥作用,但仍然无法让它在不止一列中发挥作用。这是我的代码:
SELECT
TOP 10
FieldName,
CAST(FieldValue as varchar(MAX)) As FieldValue
FROM Meter M
UNPIVOT([FieldValue] FOR FieldName IN ([MeterName],[MID])) UP
WHERE ClientNumber = 12300
每次,我都会收到错误消息“消息 8167,级别 16,状态 1,第 4 行列“MID”的类型与 UNPIVOT 列表中指定的其他列的类型冲突。”
我已经查过了,这似乎是与列类型/长度相关的问题,无论我如何转换 FieldValue,同样的错误。有什么想法吗?
编辑 3:解决列冲突...
从原始表转换结果不起作用,所以我必须使用派生表并在那里转换,以便返回到 PIVOT 的列都是相同的数据类型。奇怪,但我能找到的唯一解决方案会运行。
SELECT
FieldName,
CAST(FieldValue as varchar(MAX)) As FieldValue,
FROM
(
/*
Derived table so that we can control the column
types for everything selected, because PIVOT demands
that every pivoted column be of the same data type and
length.
*/
SELECT
TOP 1
CAST(M.MeterName as varchar(MAX)) As MeterName,
CAST(M.MID as varchar(MAX)) As MID,
CAST(D.DeviceType as varchar(MAX)) As DeviceType
FROM Meter M
INNER JOIN CurrentDevice D ON
D.ClientNumber = M.ClientNumber AND
D.MID = M.MID
WHERE
M.ClientNumber = 12300
) T
UNPIVOT([FieldValue] FOR FieldName IN ([MeterName],[MID],[DeviceType])) UP