2012-07-03 3 views
0

У меня есть R2 таблицу SQL Server 2008 с помощью следующей схемыДинамически порядок столбцов в SQL

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, который я не могу изменить.

И, наконец, если у кого есть хорошая идея для названия для этого вопроса, пожалуйста, не стесняйтесь редактировать (или комментарий, и я буду его изменить)

EDIT:

Настоящая таблица это пример основан на использовании 6 различных пар ключ-значение вместо двух, а значение «Код» является динамическим (текущая база данных имеет около 45 различных значений кода).

ответ

1
  • Если вы upvote этот ответ, пожалуйста, upvote 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] 
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 
+0

Это не так уж плохо для этого, можете ли вы придумать способ, когда есть более двух пар ключ-значение и способ обработки динамических значений «Код»? – JasonRShaver

+0

Очевидно, вы могли бы просто расширить аргументы case, чтобы обслуживать более двух пар, но это может стать громоздким. Если коды действительно динамичны, то как вы ожидаете появления окончательного результата? В алфавитном порядке? С нулями, для которых код не отображается в определенной строке? – paulbailey

+0

Я распространил ваш ответ на более общий и разместил его ниже. Если вы отредактируете свой ответ, чтобы включить мой, я удалю свою и даю вам ответ. Спасибо, что указали, насколько просто это =) – JasonRShaver

Смежные вопросы