我有一个包含一行和一些列的结果表:
column1 column2 column3 column4 column5 column6 column7 column8 column9
------------------------------------------------------------------------------------
1.4 2.2 3.4 6.57 5.6 9.7 67.6 3.4 5.9
我有一张表:
DECLARE @TTable TABLE(
ID INT,
Name VARCHAR(100),
value FLOAT
)
我想要像
这样的东西ID Name value
----------------------
1 column1 1.4
2 column2 2.2
3 column3 3.4
4 column4 6.57
5 column5 5.6
6 column6 9.7
7 column7 67.6
8 column8 3.4
9 column9 5.9
所以我做的事情是:
INSERT @TTable
SELECT [id] = ORDINAL_POSITION,
[Name] = COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'ORIGINALTABLE' ORDER BY id
此结果包含2个字段“id
”和“Name
”列,但您如何添加value
字段?
如果我在查询中添加SELECT
:
INSERT @TTable
SELECT [id] = ORDINAL_POSITION,
[Name] = COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'ORIGINALTABLE' ORDER BY id, [value] = ...
答案 0 :(得分:2)
如果您使用的是SQL Server 2008,则可以使用UNPIVOT
和动态SQL,因此您不必自己编写每一列(在使用动态SQL之前,请先查看{{3} })。试试这个:
评论后更新
DECLARE @Columns NVARCHAR(MAX)='', @Query NVARCHAR(MAX)=''
DECLARE @CastColumns NVARCHAR(MAX)=''
SELECT @Columns = @Columns + QUOTENAME(COLUMN_NAME) + ',',
@CastColumns = @CastColumns+CASE WHEN data_type <> 'float' THEN
'CAST('+QUOTENAME(COLUMN_NAME)+' AS FLOAT) AS '+QUOTENAME(COLUMN_NAME) ELSE
QUOTENAME(COLUMN_NAME) END+','
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTable'
ORDER BY ORDINAL_POSITION
SET @Columns = LEFT(@Columns,LEN(@Columns)-1)
SET @CastColumns = LEFT(@CastColumns,LEN(@CastColumns)-1)
SET @Query = '
SELECT ROW_NUMBER() OVER(ORDER BY CO.Ordinal_Position) Id, ColumnName, Value
FROM (SELECT '+@CastColumns+' FROM YourTable) AS P
UNPIVOT(value FOR ColumnName IN ('+@Columns+')) AS UC
JOIN (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''YourTable'') CO
ON ColumnName = CO.COLUMN_NAME
'
INSERT INTO @TTABLE
EXEC sp_executesql @Query
好的,现在我更改了查询,因此它对FLOAT上的FLOAT进行了CAST
。让我知道它是怎么回事。
答案 1 :(得分:1)
您需要执行交叉表查询以从具有多列的行转换为具有几列的多个行,例如in this article。或者在Celko's fantastic Sql For Smarties Book
基本上你会做一系列的case语句,通过在轴上旋转它来转换表。