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 函数,这似乎有点矫枉过正。

我承认这是一个失败的架构,但该架构属于我无法更改的第 3 方 ERP。

最后,如果有人对这个问题的标题有一个好主意,请随时编辑(或评论,我会改变它)

编辑:

这个示例所基于的真实表有 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 个通用代码/值对并正确地重新排序输出。显然它并不完美,但它解决了我的需求。

第一个查询查找代码值并将它们按表中第一项的顺序放置。将其扩展为函数或存储过程并按顺序传递并不难。

第二个查询使用 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 回答