Сравните значения из одного поля в двух разных столбцах - PullRequest
3 голосов
/ 11 апреля 2019

Мне нужно поместить рядом две части столбца в одну таблицу, имеющие одно и то же описание и другой «внешний идентификатор».Вот как выглядит входная таблица:

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

А вот что я пытаюсь достичь из моего выбора:

+-------------+-------------+
|DESCRIPTION_1|DESCRIPTION_2|
+-------------+-------------+
|some desc 1  |NULL         |
+-------------+-------------+
|some desc 2  |some desc 2  |
+-------------+-------------+
|some desc 3  |some desc 3  |
+-------------+-------------+

Я пробовал с простым JOIN, но какВы видите, мне нужно показать тоже не совпадающие значения.

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

Ответы [ 3 ]

4 голосов
/ 11 апреля 2019

Вам нужно dense_rank() и выполнить условную агрегацию:

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;
3 голосов
/ 11 апреля 2019

Если я правильно понимаю, вы можете сделать это с помощью полного внешнего соединения:

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;
0 голосов
/ 11 апреля 2019

Использование cte: (хотя я не уверен, почему вам нужно представить оба столбца вместо того, чтобы просто идентифицировать «dupes») *

Таблица:

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

CTE

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...