2016-06-09 3 views
0

У меня есть таблица в SQL, который будет содержать несколько строк для одного идентификатора, как показано нижеSQL выберите строки, которые имеют одно значение, но не другой

accountid Productname 
1   GL 
1   IP 
1   MI 
2   GL 
2   IP 
2   PA 
3   MI 
3   CP 
3   IP 
4   GL 
4   CP 
4   CI 

Я хочу, чтобы иметь возможность выбрать все учетные записи, которые имеют определенные продукты но не другие. Например, все, что есть IP или GL, но не MI, используя образец таблицу выше, будет возвращен счет 2 и 4.

SELECT ccx_accountidname 
FROM (
    SELECT ccx_accountidname, ccx_productname 
    FROM Filteredccx_leadresearch 
    WHERE ccx_productname IN ('GL','IP') 
    AND ccx_accountidname IS NOT NULL 
    ) AS T 
WHERE ccx_productname NOT IN ('MI') 
ORDER BY ccx_accountidname 

и

SELECT DISTINCT LR1.ccx_accountidname 
FROM Filteredccx_leadresearch LR1 
LEFT JOIN Filteredccx_leadresearch LR2 ON LR1.ccx_accountid = LR2.ccx_accountid 
AND LR2.ccx_productname IN ('GL', 'IP') 
WHERE LR1.ccx_productname NOT IN ('MI') 
AND LR1.ccx_accountidname IS NOT NULL 
ORDER BY LR1.ccx_accountidname 

Оба дают в основном те же результаты, есть ли это можно сделать?

Заранее спасибо за любую помощь

+0

это ТОЛЬКО две колонки? – scsimon

+0

Нет много столбцов, но это единственные 2, которые действительно меня интересуют в данный момент. – SnowSheep

+0

Другие столбцы дают вам возможность поворота, но это зависит от столбцов. – scsimon

ответ

0

Не могли бы вы попробовать это:

SELECT DISTINCT T1.Accountidname FROM TheTableThatContainsAccountnames as T1 
JOIN AccountProductsTable as T2 on T1.AccountId=T2.AccountId 
WHERE T2.ProductName = 'ProductYouWant' 
AND T2.ProductName = 'AnOtherProductYouWant' 
+0

Спасибо за ваш ответ Пол. К сожалению, это все равно не сработает, я не могу использовать AND в предложении where, так как поле продукта будет содержать только один продукт. Я попробовал ИЛИ, но он все еще тянет через учетные записи, которые имеют другие продукты. – SnowSheep

+0

Мой плохой, я неправильно понял проблему. Я в настоящее время ищу решение, но это не так тривиально, как я думал ... –

0

По вашему сообщению, все, что вам действительно нужно, это простой запрос с правильным и логикой. Вам нужны все учетные записи с именем продукта GL или IP, но не в MI. Это сделает это без каких-либо других объединений.

SELECT ccx_accountidname 
    FROM Filteredccx_leadresearch 
    WHERE 
     ccx_productname in ('GL','IP') 
     and ccx_productname not in ('MI') 

EDIT

Это поможет вам счет, хотя я сомневаюсь, что это будет работать в ваше общее решение. Это просто сложно сказать, не видя ваш полный набор данных. Это можно сделать и с параметрами.

IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL 
DROP TABLE #TempTable 

IF OBJECT_ID('tempdb..#TempTableTwo') IS NOT NULL 
DROP TABLE #TempTableTwo 

create table #TempTable (accountid int, productname char(2)) 
insert into #TempTable (accountid,productname) values 
(1,'GL'), 
(1,'IP'), 
(1,'MI'), 
(2,'GL'), 
(2,'IP'), 
(2,'MA') 


select distinct 
    t1.accountid, 
    1 as T 
into #TempTableTwo 
from 
    #TempTable t1 
where 
    productname in ('GL','IP') 
union all 
select distinct 
    t1.accountid, 
    -1 as T 
from 
    #TempTable t1 
where 
    productname in ('MI') 

select 
    accountid 
from #TempTableTwo 
group by accountid 
having sum(T) > 0 
+0

Спасибо за предложение, но я не думаю, что все так просто. Использование этого метода по-прежнему будет возвращать учетные записи с ИМ, если они также имеют IP или GL. Спасибо – SnowSheep

+0

Это возвращает учетные записи, которые НЕ имеют MI, следовательно, 'NOT IN'. Возможно, я в замешательстве относительно вашего ожидаемого результата или чего-то не хватает в коде, который вам нужно вернуть или принять во внимание. – scsimon

+0

Я, вероятно, неправильно объяснил ситуацию. В моей таблице образцов accountid 1 имеет строки для GL, IP и MI. Поскольку у меня есть MI, я бы не хотел, чтобы эта учетная запись появлялась вообще, но в этом запросе она была бы потому, что у нее также есть GL и IP. У Accountid 2 есть GL, IP и PA, поэтому я бы хотел показать, поскольку у него нет ИМ. Это вообще имеет смысл? – SnowSheep

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