J'ai besoin de mettre côte à côte deux parties d'une colonne dans une table, ayant la même description et un "ID externe" différent. Voici à quoi ressemble la table d'entrée:
SELECT a.DESCRIPTION AS DESCRIPTION_1,
b.DESCRIPTION AS DESCRIPTION_2
FROM My_Table a
JOIN My_Table b on a.DESCRIPTION = b.DESCRIPTION
WHERE a.OUTERID = 1
AND b.OUTERID = 2
Et voici ce que j'essaie de réaliser à partir de ma sélection:
+-------------+-------------+ |DESCRIPTION_1|DESCRIPTION_2| +-------------+-------------+ |some desc 1 |NULL | +-------------+-------------+ |some desc 2 |some desc 2 | +-------------+-------------+ |some desc 3 |some desc 3 | +-------------+-------------+
I essayé avec un simple JOIN, mais comme vous pouvez le voir, je dois également afficher les valeurs qui ne correspondent pas.
+--+-------+-----------+ |ID|OUTERID|DESCRIPTION| +--+-------+-----------+ |1 |1 |some desc 1| +--+-------+-----------+ |2 |1 |some desc 2| +--+-------+-----------+ |3 |1 |some desc 3| +--+-------+-----------+ |4 |2 |some desc 2| +--+-------+-----------+ |5 |2 |some desc 3| +--+-------+-----------+
3 Réponses :
Vous avez besoin de dense_rank () et faites une agrégation conditionnelle:
select max(case when OUTERID = 1 then DESCRIPTION end) as DESCRIPTION_1,
max(case when OUTERID = 2 then DESCRIPTION end) as DESCRIPTION_2
from (select t.*,
dense_rank() over (order by DESCRIPTION) as seq
from table t
) t
group by seq;
Marche parfaitement. Merci.
Si je comprends bien, vous pouvez le faire avec une jointure externe complète:
SELECT a.DESCRIPTION AS DESCRIPTION_1,
b.DESCRIPTION AS DESCRIPTION_2
FROM (SELECT a.*
FROM My_Table a
WHERE a.OUTERID = 1
) a FULL JOIN
(SELECT b.*
FROM My_Table b
WHERE b.OUTERID = 2
) b
ON a.DESCRIPTION = b.DESCRIPTION;
Donc, en termes de performances, c'est beaucoup mieux par rapport à une requête de @YogeshSharma
@VishalSuthar. . . Je ne suis pas sûr. Vous auriez à le tester. La requête de Yogesh est également tout à fait raisonnable. J'ai offert cela parce que cela semblait plus proche de votre approche originale.
Utilisation d'un cte: (Cependant, je ne sais pas pourquoi vous auriez besoin de présenter les deux colonnes au lieu de simplement identifier les 'dupes')
Table:
With cte As
(
Select Description, Count(Distinct OuterID) As recs From #tbl
Group By Description
)
Select
Case When recs = 2 Or recs = 1 Then Description End As Description_1,
Case When recs = 2 Then Description End As Description_2
From cte
CTE
Create Table #tbl ( ID Int, OUTERID Int, DESCRIPTION VarChar(20) ) Insert Into #tbl Values (1,1,'some desc 1'), (2,1,'some desc 2'), (3,1,'some desc 3'), (4,2,'some desc 2'), (5,2,'some desc 3')