3
votes

Comparez les valeurs du même champ dans deux colonnes différentes

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|
+--+-------+-----------+


0 commentaires

3 Réponses :


4
votes

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;


1 commentaires

Marche parfaitement. Merci.



3
votes

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;


2 commentaires

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.



0
votes

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


0 commentaires