Sql server 布局sql server
我有一张像这样的桌子Sql server 布局sql server,sql-server,layout,transform,Sql Server,Layout,Transform,我有一张像这样的桌子 att1 att2 att3 att4 ------------------- 1 6 11 16 2 7 12 17 3 8 13 18 4 9 14 19 将表格作为坐标系的查询是什么: a b val ------- 1 1 1 1 2 6 1 3 11 1 4 16 2 1 2 2 2 7 2 3 12 2 4 17 3 1 3 3 2 8 3 3 13 3 4
att1 att2 att3 att4
-------------------
1 6 11 16
2 7 12 17
3 8 13 18
4 9 14 19
将表格作为坐标系的查询是什么:
a b val
-------
1 1 1
1 2 6
1 3 11
1 4 16
2 1 2
2 2 7
2 3 12
2 4 17
3 1 3
3 2 8
3 3 13
3 4 18
4 1 4
4 2 9
4 3 14
4 4 19
目前我有:
select 1,att1 from data_journal_insurance_raw union all
select 2,att2 from data_journal_insurance_raw union all
select 3,att3 from data_journal_insurance_raw union all
select 4,att4 from data_journal_insurance_raw
我缺少了“b”部分,怎么做?你应该在Union中有3列
select att1 ,1,att1 from data_journal_insurance_raw union
select att1 ,2,att2 from data_journal_insurance_raw union
select att1 ,3,att3 from data_journal_insurance_raw union
select att1 ,4,att4 from data_journal_insurance_raw
如果我理解正确,您希望将表转换为包含行、列和值的表 实际上,您缺少了
a
部分a
表示行,而b
表示列。下面的查询应该对您有所帮助
WITH cte AS (SELECT ROW_NUMBER() OVER (ORDER BY att1) AS a, * FROM data_journal_insurance_raw)
SELECT a, 1 as b, CAST(att1 AS VARCHAR(MAX)) FROM cte UNION ALL
SELECT a, 2 as b, CAST(att2 AS VARCHAR(MAX)) FROM cte UNION ALL
SELECT a, 3 as b, CAST(att3 AS VARCHAR(MAX)) FROM cte UNION ALL
SELECT a, 4 as b, CAST(att4 AS VARCHAR(MAX)) FROM cte
ORDER BY a, b
请注意,我正在将value列强制转换为VARCHAR(MAX)
,因为我不知道表中有哪些数据类型。如果它们都是数字,则可以删除CAST
函数
如果你只在一张桌子上做一次,那么这对你来说很好。但是,如果希望能够在各种表上执行此操作,可以让SQLServer为您编写代码。这里有一个程序可以做到这一点:
CREATE PROCEDURE usp_Coordinate_table(@TableName NVARCHAR(200)) AS
BEGIN
DECLARE @sql NVARCHAR(MAX);
WITH cte AS (SELECT TOP 1 c.name FROM sys.columns c, sys.objects o WHERE c.object_id = o.object_id AND o.name = @TableName)
SELECT @sql = 'WITH RowData AS (SELECT ROW_NUMBER() OVER (ORDER BY '+name+') AS RowNum, * FROM '+@TableName+') ' FROM cte;
WITH ColData AS (SELECT ROW_NUMBER() OVER (ORDER BY c.column_id) AS ColNum, c.name
FROM sys.columns c, sys.objects o WHERE c.object_id = o.object_id AND o.name = @TableName)
SELECT @sql = @sql + 'SELECT RowNum, '+CAST(c.ColNum AS VARCHAR)+' AS ColNum, CAST('+c.name+' AS VARCHAR(MAX)) AS Value FROM RowData UNION ALL '
FROM ColData c
SET @sql = SUBSTRING(@sql, 1, LEN(@sql) - 10) + ' ORDER BY RowNum, ColNum'
EXEC sp_executesql @sql
END
您使用的是什么版本的sql server?