2014-10-01 9 views
0

Я исследовал предыдущие вопросы, но не смог найти тот, который реплицировал мой или это было легко понять. Я надеюсь, что это относительно простой ответ, если я дублировал, извините.SQL - Можно ли выбрать все отличительные значения из одного столбца, где совпадают все значения из другого столбца?

У меня есть таблица в SQL, которая каталогизирует все наши отчеты (согласно упрощенной версии ниже).
Имеет ReportCountryID в качестве основного ключа, ReportID, CountryID, CountryName.

 
ReportCountryID ReportID CountryID CountryName 
0001     8447   12 Bosnia 
0002     9740   13 Bosnia & Herzegovina 
0003     9278   13 Bosnia & Herzegovina 
0004     8447   128 Czech Rep 
0005     9740   25 Czech Republic 
0006     9278   25 Czech Republic 
0007     9714   83 Russia 
0008     9742   83 Russia 
0009     9672   83 Russia 
0010     9740   83 Russia 
0011     9278   83 Russia 
0012     8447   83 Russia 
0013     9740   106 UK 
0014     9278   106 UK 
0015     9252   124 UK & NI 
0016     9740   110 USA 
0017     8447   108 United States 
0018     9252   110 USA 
0019     9278   110 USA 

Что я пытаюсь сделать, это выяснить, какие отчеты используют все те же названия стран и каковы названия этих стран?

В приведенном выше примере только отчеты 9278 и 9740 используют Боснию & Герцеговина, Чешская Республика, Россия, Великобритания и США. Тем не менее, это всего лишь небольшая выборка, которую я выбрал, чтобы визуально видеть различия.

Может выход выглядеть следующим образом: -

 
9728     9740 
Bosnia & Herzegovina Bosnia & Herzegovina 
Czech Republic  Czech Republic 
Russia    Russia 
UK     UK 
USA     USA 
+1

Как выглядит нужный результат? Можете ли вы опубликовать образец вывода вместо того, чтобы пытаться описать его словами? –

ответ

0

Следующая выберите возвращает все записи, которые имеют тот же CountryName по крайней мере еще раз в таблицу, а затем сгруппировать их игнорировать ReportCountryID поле:

select ReportID, 
     CountryID, 
     CountryName 
    from ReportCountryTable rpt1 
where exists (select 1 
       from ReportCountryTable rpt2 
       where rpt2.ReportCountryID <> rpt1.ReportCountryID 
        and rpt2.CountryName  = rpt1.CountryName) -- or you can use rpt2.CountryID = rpt1.CountryID 
group by ReportID, 
      CountryID, 
      CountryName 
order by CountryID, 
      CountryName 

выход, с подмножеством данных, будет выглядеть следующим образом:

 
ReportID CountryID CountryName 
----------- ----------- ----------------------------------------------------------- 
9278  13   Bosnia & Herzegovina 
9740  13   Bosnia & Herzegovina 
9278  25   Czech Republic 
9740  25   Czech Republic 
8447  83   Russia 
9278  83   Russia 
9672  83   Russia 
9714  83   Russia 
9740  83   Russia 
9742  83   Russia 
9278  106   UK 
9740  106   UK 
9252  110   USA 
9278  110   USA 
9740  110   USA 
0
DECLARE @tempTable table 
(
    countryID int 
) 

--Match with five countries as per the example 
INSERT INTO @tempTable values 
(25), (13) ,(110) , (106), (83) 
--In case you want to match all distinct countries then you can comment above line and use below line. 
--INSERT INTO @tempTable 
--SELECT distinct CountryID from Table1 

SELECT T1.ReportID FROM 
Table1 T1 
JOIN (SELECT countryId from @tempTable) T2 
ON T1.CountryID = T2.countryID 
GROUP BY T1.ReportID 
HAVING COUNT(DISTINCT T1.CountryID) = (SELECT COUNT(countryID) FROM @tempTable) 
+0

Привет Раджеш Спасибо за ваш ответ. Однако, когда я пытаюсь это сделать на примере данных, возвращается только ReportID 9278. – jellybean1977

+0

@ jellybean1977, я пробовал с данными образца и получал как 9278, так и 9740, вот демо-скрипт sql http://www.sqlfiddle.com/#!3/fa0a3a/1 – radar

+0

Спасибо Раджеш. Теперь ваш код работает. Думаю, я ошибся при создании моей таблицы. Однако, если я использую бит, где вы говорите, если я хочу соответствовать всем отдельным странам, я не получаю никакого результата? – jellybean1977

Смежные вопросы