2012-05-03 18 views
0

我有一個像佈局的SQL Server

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'部分如何做到這一點?

+0

你使用的是什麼版本的sql-server? – Arion

回答

1

如果我理解正確的話,你希望將表格轉換爲包含行,列和值的表。

其實,你錯過了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 

注意到,我精鑄人的價值列VARCHAR(MAX),因爲我不知道你在你的表的數據類型。如果它們都是數字,則可以刪除CAST函數。

如果你只在一張桌子上做過一次,那麼這對你來說可以正常工作。但是,如果您希望能夠在各種表上執行此操作,則可以使SQL Server爲您編寫代碼。這是一個可以做到這一點的程序:

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 '[email protected]+') ' 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 
0

你應該有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