2

我有一个返回单行数据的查询。假设它看起来像这样(带有列标题)。

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
4

3 回答 3

8

对于 SQL Server 2005+,您可以使用UNPIVOT

SELECT FieldName, Value
FROM YourTable T
UNPIVOT([Value] FOR FieldName IN (Fruit, Veg, Meats, Nuts)) UP

这是一个 SQL Fiddle供您尝试。

针对新要求进行了更新

好的,所以如果您不知道表的列,则需要动态 SQL。首先,转到此链接。然后您可以尝试以下操作:

DECLARE @Fields NVARCHAR(MAX), @Sql NVARCHAR(MAX)

SELECT @Fields = STUFF((SELECT DISTINCT ',' + QUOTENAME(Name) 
                        FROM sys.columns
                        WHERE OBJECT_ID = OBJECT_ID('YourTable')
                        FOR XML PATH('')),1,1,'')


SET @Sql = '
SELECT FieldName, Value
FROM YourTable T
UNPIVOT([Value] FOR FieldName IN ('+@Fields+')) UP
'

EXEC sp_executesql @sql
于 2012-08-28T14:07:37.930 回答
4

你可以使用动态 UNPIVOT 查询

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols =  STUFF((SELECT ','+ QUOTENAME( name) from sys.columns 
where object_id= object_id('your_table')
FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'select FieldName, Value
FROM your_table T
UNPIVOT([Value] FOR FieldName IN ('+@cols+')) P'

exec(@query)


SQL 小提琴演示

于 2012-08-28T14:20:06.790 回答
0

您可以PIVOT为此使用:http: //msdn.microsoft.com/en-us/library/ms177410 (v=sql.105).aspx 。

于 2012-08-28T13:54:11.357 回答