J'ai une gentille dame qui veut un formatage spécifique sur la sortie, et je vois que c'est très spécial bien que contre les règles communes, pouvez-vous me conseiller si je peux y parvenir d'une manière ou d'une autre avec TSQL. J'ai collé un échantillon d'entrée et je voulais une sortie. C'est, je pense, une sorte de FULL JOIN mais j'ai besoin de faire plus de nettoyage, un peu perdu ici. Mon premier projet. J'ai essayé de la convaincre d'utiliser 2 tables séparées pour la sortie afin de maintenir une certaine intégrité, mais j'ai échoué, alors en prenant cela comme un défi) ! Il n'y a AUCUNE relation entre LineOrd et LinePr. J'ai composé quelque chose avec plusieurs étapes, mais l'impression devrait être plus élégante que de faire 4 à 5 étapes. Meilleur

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
Mich28 24 janv. 2020 à 06:37

1 réponse

Meilleure réponse

Vous avez besoin de FULL OUTER JOIN sur OrderID et LineOrd. Et utilisez COALESCE() pour renvoyer la première colonne non nulle de 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)
3
Squirrel 24 janv. 2020 à 03:57