我有一个带有以下架构的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个不同的代码值)。
答案 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)
它处理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]