0

私は次のようなテーブルを持っています

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」の部分がありません。どうすればよいですか?

4

2 に答える 2

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関数を削除できます。

1つのテーブルでこれを1回だけ実行している場合は、これで問題なく機能します。ただし、さまざまなテーブルでこれを実行できるようにする場合は、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
于 2012-05-03T11:13:56.047 に答える
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
于 2012-05-03T06:52:03.160 に答える