在SQL中动态排序列

时间:2012-07-03 06:21:51

标签: sql sql-server tsql

我有一个带有以下架构的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。

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

编辑:

此示例基于的实际表有6个不同的键值对而不是2个,“Code”值是动态的(当前数据库有大约45个不同的代码值)。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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]