0

次のスキーマを持つ SQL Server 2008 R2 テーブルがあります

DECLARE @AttributeTable TABLE
(
     Code1 nvarchar(50),
     Value1 nvarchar(50),
     Code2 nvarchar(50),
     Value2 nvarchar(50),
     Stock int
);

次のような値を使用します。

Color, Red, Size, Large, 15
Color, Blue, Size Large, 5
Size, Large, Color, Green, 4

そして、クエリの結果が

Color, Red, Size, Large, 15
Color, Blue, Size Large, 5
Color, Green, Size, Large, 4

しかし、.NET 関数の作成に頼らずにこれを行う方法は考えられません。これはやり過ぎのように思えます。

これが失敗したアーキテクチャであることは認めますが、スキーマは変更できないサードパーティの ERP に属しています。

そして最後に、誰かがこの質問のタイトルについて良いアイデアを持っている場合は、自由に編集してください (またはコメントしてください。変更します)。

編集:

この例が基づいている実際のテーブルには、2 つではなく 6 つの異なるキーと値のペアがあり、「コード」値は動的です (現在のデータベースには約 45 の異なるコード値があります)。

4

2 に答える 2

4

表が示すように単純な場合、それは比較的簡単です。

SELECT
    'Color',
    CASE WHEN Code1 = 'Color' THEN Value1 ELSE Value2 END,
    'Size',
    CASE WHEN Code1 = 'Size' THEN Value1 ELSE Value2 END,
    Stock
FROM
    @AttributeTable
于 2012-07-03T06:27:49.160 に答える
1
  • この回答に賛成票を投じる場合は、PaulBailey の回答に賛成票を投じてください。

これにより、3 つの一般的なコード/値のペアが処理され、出力が正しく並べ替えられます。明らかに完璧ではありませんが、私のニーズを解決してくれました。

最初のクエリは、コード値を見つけて、テーブルの最初の項目の順に並べます。これを関数またはストアド プロシージャとして拡張し、順序で渡すことは難しくありません。

2 番目のクエリは、PaulBailey のソリューションを使用してペアを正しく並べ替えます。

       DECLARE @ItemCode nvarchar(50) = 'ITEM-000001'
       DECLARE @Code1 nvarchar(50)
       DECLARE @Code2 nvarchar(50)
       DECLARE @Code3 nvarchar(50)

        SELECT TOP 1
               @Code1 = ii.AttributeCode1
             , @Code2 = ii.AttributeCode2
             , @Code3 = ii.AttributeCode3
          FROM @AttributeTable ii
         WHERE ii.ItemCode = @ItemCode

        SELECT ii.ItemCode
             , @Code1 as [AttributeCode1]
             , CASE WHEN ii.AttributeCode1 = @Code1 THEN ii.Attribute1 
                    WHEN ii.AttributeCode2 = @Code1 THEN ii.Attribute2 
                    WHEN ii.AttributeCode3 = @Code1 THEN ii.Attribute3
                    ELSE null END as [Attribute1]
             , @Code2 as [AttributeCode2]
             , CASE WHEN ii.AttributeCode1 = @Code2 THEN ii.Attribute1 
                    WHEN ii.AttributeCode2 = @Code2 THEN ii.Attribute2 
                    WHEN ii.AttributeCode3 = @Code2 THEN ii.Attribute3
                    ELSE null END as [Attribute2]
             , @Code3 as [AttributeCode3]
             , CASE WHEN ii.AttributeCode1 = @Code3 THEN ii.Attribute1 
                    WHEN ii.AttributeCode2 = @Code3 THEN ii.Attribute2 
                    WHEN ii.AttributeCode3 = @Code3 THEN ii.Attribute3
                    ELSE null END as [Attribute3]
          FROM @AttributeTable ii
         WHERE ii.ItemCode = @ItemCode
      ORDER BY [AttributeCode1], [Attribute1]
             , [AttributeCode2], [Attribute2]
             , [AttributeCode3], [Attribute3]
于 2012-07-08T04:42:08.380 に答える