T SQL полное соединение со специальным форматированием - PullRequest
0 голосов
/ 24 января 2020

У меня есть симпатичная леди, которая хочет указать c форматирование при выводе, и я вижу, что это очень необычно, несмотря на общие правила, можете ли вы посоветовать, если я смогу добиться этого каким-то образом с TSQL. Я вставил образец ввода и хотел вывод. Я думаю, что это ПОЛНОЕ СОЕДИНЕНИЕ, но нужно сделать больше очистки, здесь немного потеряно. Мой первый проект. Попытка убедить ее использовать 2 отдельные таблицы для вывода, чтобы сохранить некоторую целостность, но не удалось, так что принять это вызов)! НЕТ отношений между LineOrd и LinePr. Я сочинил что-то с несколькими шагами, но чувствую, что должен быть более элегантным, чем делать 4-5 шагов. Лучший

DROP TABLE If exists #o
CREATE TABLE #o (OrderID int,   LineOrd int,    ProductID int)
INSERT #o VALUES 
(111,   1,  10001),(2222,   1,  2001),(2222,    2,  2002),
(2222,  3,  2003),(3333,    1,  30001),(3333,   2,  30002)

DROP TABLE If exists #p
CREATE TABLE #p (OrderID int,   LinePr int, ProfileID CHAR(10))
INSERT #p VALUES 
(111,   1,  'alpha1'),(111, 2,  'bravo1'),
(2222,  1,  'charlie2'),(2222,  2,  'delta2'),
(3333,  1,  'echo3'),(3333, 2,  'hotel3')

--    select   * from #o;   select    * from #p

SELECT   
o.*, '--' f  
,p.LinePR, p.ProfileID
,ROW_NUMBER() OVER (PARTITION BY o.orderID, o.lineOrd ORDER BY lineOrd) rn
,ROW_NUMBER() OVER (PARTITION BY o.orderID, p.linePr  ORDER BY linePr ) rn2
,OrdMax = (SELECT MAX(lineOrd) FROM #o  o2 WHERE o2.OrderID = o.OrderID)
,PrMax = (SELECT MAX(linePr)   FROM #p  p2 WHERE p2.OrderID  = p.OrderID)
, 0 sw

FROM #o o
FULL JOIN #p p  ON p.orderID = o.OrderID
ORDER BY 1,2,5

-- need more cleaning 

sample Output

1 Ответ

3 голосов
/ 24 января 2020

Вам нужно FULL OUTER JOIN на OrderID и LineOrd. И используйте COALESCE(), чтобы вернуть первый ненулевой столбец OrderID

SELECT  OrderID = COALESCE(o.OrderID, p.OrderID),
        o.LineOrd,
        o.ProductID,
        p.LinePr,
        p.ProfileID
FROM    #o o
FULL OUTER JOIN #p p    ON  p.OrderID = o.OrderID
                       AND  p.LinePr  = o.LineOrd
ORDER BY OrderID, 
         COALESCE(o.LineOrd, p.LinePr)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...