Как получить максимум два значения из каждой строки и объединить их в SQL? - PullRequest
0 голосов
/ 11 июня 2018

Я создал Таблицу 1 для транспортных средств, и она имеет цветовые значения (Red, Blue, Yellow).Мне нужно обновить поле Colors таблицы 2, получив имена полей максимум двух значений каждой таблицы в таблице 1 и конкатенировать их.

Используя вложенный if-else, я мог бы получить первое максимальное значение, но могне получить второе максимальное значение каждой строки.

Поле таблицы 2 Color имеет ожидаемый результат обновления:

enter image description here

ТАБЛИЦА 1

Vehicle  Red   Blue  Yellow
Honda    10     20    25
Yamaha   12     10    22
Suzuki   25     30    40

ТАБЛИЦА 2

Vehicle   Color
Honda     Blue/Yellow
Yamaha    Red/Yellow 
Suzuki    Blue/Yellow

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Всего тремя цветами - при условии, что все значения уникальны - вы можете получить с помощью case выражений:

select ((case when red > blue and red > yellow then 'red'
              when blue > yellow then 'blue'
              else 'yellow'
          end) + '/' +
         (case when red > blue and red < yellow or red < blue and red > yellow then 'red'
               when blue > red and blue < yellow or blue < red and blue < yellow then 'blue'
               else 'yellow'
          end)
        )

Результаты немного отличаются от заявленных вами результатов.Доминирующий цвет - первый, но это похоже на выгоду.

Если вы хотите использовать cross apply, то один (относительно) простой метод:

select max(c.color) + '/' + min(c.color)
from t cross apply
     (select top (2) v.*
      from (values ('red', red), ('blue', blue), ('yellow', yellow)) v(color, val)
      order by val desc
     ) c;

Цветане упорядочены по их стоимости.Вы можете легко организовать это:

select max(case when seqnum = 1 then c.color en) + '/' + max(case when seqnum = 1 then c.color end)
from t cross apply
     (select v.*, row_number() over (order by v.val desc) as seqnum
      from (values ('red', red), ('blue', blue), ('yellow', yellow)) v(color, val)
     ) c;
0 голосов
/ 11 июня 2018

Вы можете использовать cte:

with t as (
        select *, row_number() over (partition by Vehicle order by ColrVal) Seq
        from table1 t1 cross apply (
              values ('Red', Red), ('Bule', Blue), ('Yellow', Yellow) 
             ) t2 (Colr, ColrVal)
)

select Vehicle,
       stuff ( (select '/'+Colr 
                from t t2
                where t2.Vehicle = t1.Vehicle and t2.Seq > 1
                for xml path('')
                ), 1, 1, ''
             ) as Color
from t t1
group by Vehicle;

Однако здесь используется функция row_number(), чтобы получить самые верхние цвета и выполнить group_concat, используя метод xml с * 1008.* функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...