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')