ЗАКАЗАТЬ НА ОСНОВЕ КОЛОННЫ - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть две таблицы: PRODUCTS AND LOOKUP TABLES. Теперь я хочу заказать столбец KEY в таблице продуктов на основе значения столбца KEY в LOOKUP TABLE.

CREATE TABLE PRODUCTS
(
    ID INT,
    KEY VARCHAR(50)
)

INSERT INTO PRODUCTS 
VALUES (1, 'EGHS'), (2, 'PFE'), (3, 'EGHS'),
       (4, 'PFE'), (5, 'ABC')

CREATE TABLE LOOKUP (F_KEY VARCHAR(50))

INSERT INTO LOOKUP VALUES('PFE,EGHS,ABC')

Теперь я хочу упорядочить записи вТаблица PRODUCTS основана на значениях KEY (PFE,EGHS,ABC) в таблице LOOKUP.

Пример вывода:

PRODUCTS

ID   F_KEY
-----------    
2    PFE
4    PFE
1    EGHS
3    EGHS
5    ABC

Я использую этот запрос, но он не работает

SELECT * 
FROM PRODUCTS 
ORDER BY (SELECT F_KEY FROM LOOKUP)

Ответы [ 2 ]

1 голос
/ 14 апреля 2019

Вы можете сделать это так:

SELECT ID, [KEY] FROM PRODUCTS
ORDER BY
CASE [KEY]
  WHEN 'PFE' THEN 1
  WHEN 'EGHS' THEN 2
  WHEN 'ABC' THEN 3
END
1 голос
/ 14 апреля 2019

Вы можете разбить строку, используя XML. Сначала необходимо преобразовать строку в XML и заменить запятую начальными и конечными тегами XML.

После этого вы можете назначить инкрементный номер, используя ROW_NUMBER(), как показано ниже.

;WITH cte 
     AS (SELECT dt, 
                Row_number() 
                  OVER( 
                    ORDER BY (SELECT 1)) RN 
         FROM   (SELECT Cast('<X>' + Replace(F.f_key, ',', '</X><X>') 
                             + '</X>' AS XML) AS xmlfilter 
                 FROM   [lookup] F)F1 
                CROSS apply (SELECT fdata.d.value('.', 'varchar(500)') AS DT 
                             FROM   f1.xmlfilter.nodes('X') AS fdata(d)) O) 
SELECT P.* 
FROM   products P 
       LEFT JOIN cte C 
              ON C.dt = P.[key] 
ORDER  BY C.rn 

Демонстрация в Интернете

Выход:

ID   F_KEY
-----------    
2    PFE
4    PFE
1    EGHS
3    EGHS
5    ABC
...