1

行ごとの処理なしでSQLServer2005で次のことを行うことは可能ですか?もしそうなら、どのように?:)

私のテーブルは次のようなものです。

╔════════════╦═══════════╦════════════╗
║ CustomerID ║ FirstName ║  LastName  ║
╠════════════╬═══════════╬════════════╣
║          1 ║ George    ║ Washington ║
║          2 ║ Benjamin  ║ Franklin   ║
║          3 ║ Thomas    ║ Jefferson  ║
╚════════════╩═══════════╩════════════╝

上記の表を次のように出力します。

╔════════════╦══════════╦════════════╗
║   Field    ║ IntValue ║ TextValue  ║
╠════════════╬══════════╬════════════╣
║ CustomerID ║ 1        ║ NULL       ║
║ FirstName  ║ NULL     ║ George     ║
║ LastName   ║ NULL     ║ Washington ║
║ CustomerID ║ 2        ║ NULL       ║
║ FirstName  ║ NULL     ║ Benjamin   ║
║ LastName   ║ NULL     ║ Franklin   ║
║ CustomerID ║ 3        ║ NULL       ║
║ FirstName  ║ NULL     ║ Thomas     ║
║ LastName   ║ NULL     ║ Jefferson  ║
╚════════════╩══════════╩════════════╝

ありがとう!ジェイソン

4

2 に答える 2

2

SELECTが消費されるレイヤーでは、このピボットの方がはるかに優れていると思いますが、ここに1つのアイデアがあります。

DECLARE @x TABLE(CustomerID INT, FirstName VARCHAR(32), LastName NVARCHAR(32));

INSERT @x SELECT 1, 'George', 'Washington'
UNION ALL SELECT 2, 'Benjamin', 'Franklin'
UNION ALL SELECT 3, 'Thomas', 'Jefferson';

;WITH x AS
(
  SELECT 
    Field = 'CustomerID', IntValue = CustomerID, TextValue = NULL,
    rn = ROW_NUMBER() OVER (ORDER BY CustomerID)
    FROM @x
  UNION ALL
  SELECT 
    Field = 'FirstName', NULL, FirstName,
    rn = ROW_NUMBER() OVER (ORDER BY CustomerID)
    FROM @x
  UNION ALL
  SELECT
    Field = 'LastName', NULL, LastName,
    rn = ROW_NUMBER() OVER (ORDER BY CustomerID)
    FROM @x
)
SELECT Field, IntValue, TextValue
FROM x
ORDER BY rn, Field;

なぜこれは後のプレゼンテーションでよりよく行われるのですか?この「ソリューション」はテーブルを3回スキャンするためです。そして、消費者はまだ結果を表示するためにループを使用する必要があります...

于 2012-05-24T17:06:56.033 に答える
1

これはテーブルを1回だけスキャンします(@Aaronの回答からテーブル変数を借用します)。

SELECT Field, 
       IntValue, 
       TextValue 
FROM   @x 
       CROSS APPLY (SELECT 'CustomerID', CustomerID,  NULL 
                    UNION ALL 
                    SELECT 'FirstName', NULL, FirstName
                    UNION ALL 
                    SELECT 'LastName', NULL, LastName) 
        CA(Field, IntValue, TextValue) 
ORDER BY CustomerID  
于 2012-05-24T18:00:51.837 に答える