2015-03-24 3 views
0

У меня есть таблица RetailКак сформулировать этот SQL-запрос

CustomerID  Itemset 
    1    31 
    1    30 
    1    78 
    2    31 
    2    91 
    3    30 
    3    31 

Я хочу, чтобы найти кол CustomerID имеющих как 30 & 31 в Itemset. I.e. В этом случае 1 & 3, поэтому счет 2.

Я попытался сформулировать запрос, используя оператор &, но запрос не возвращает правильный ответ.

мой query- Select count(customerID) from Retail where Itemset=30 & 31

ответ

3
select count(*) 
from 
(
    select CustomerId 
    from Retail 
    where Itemset in (30,31) 
    group by CustomerId 
    having count(distinct Itemset) = 2 -- this guarantees that CustomerId have at least one 30 and at least one 31 in column Itemset 
) T 
+3

Я думаю, что это правильный ответ. http://www.sqlfiddle.com/#!6/a955e/3 – Jamiec

+0

@ash Спасибо вам большое. Извините за позднюю обратную связь. Что делать, если я хочу сравнить 3 значения (30,31,71), какие изменения в запросе мне нужно будет сделать? – Api

+0

@Api, 1-й: где Элемент в (30,31,71); 2-й: с подсчетом (разный набор) = 3 – ASh

2
Select count(distinct(CustomerID)) from (
    select r30.CustomerID 
    from Retail r30 
    inner join Retail r31 on 
    r31.CustomerID = r30.CustomerID 
    where 
    r30.Itemset = 30 
    and r31.Itemset = 31 
) T 
+0

Это также даст правильный ответ (HTTP: // WWW .sqlfiddle.com/#! 6/a955e/6) - то есть, когда вы исправляете свои 2 синтаксические ошибки (отсутствует закрытие ')' и отсутствует псевдоним таблицы). – Jamiec

0

Вы только хотите, чтобы рассчитывать отчетливый CustomerID-х .... я не проверял, но считаю, что это путь ...

Select count(distinct customerID) 
from Retail 
where Itemset in (30,31) 

--- Это было неправильно ... после небольшого лужения, я пришел к уже Предложенное решение ... игнорируйте ....

Select count(*) 
from (
     Select CustomerID 
     from Retail 
     where Itemset in (30,31) 
     group by CustomerID 
     having count(CustomerID = 2) 
) T 

--- Kudos. Это предполагает, что CustomerID и Itemset не могут иметь дубликатов. Другими словами, предполагается, что у вас не будет двух или более строк с 1,30 для CustomerID и Itemset.

+1

Это то же самое, что и мой (теперь удаленный) ответ. Удаляется, потому что он дает ответ '3' не' 2' как запросы OP. Вы видите, что это вернет всех 3 клиентов, но только у 2 из них есть ItemSet 30 и Itemset 31. – Jamiec

+0

Спасибо, что сообщили мне @Jamiec ... Я исправил свое решение, когда я его протестировал и дал немного другую версию, но я верьте такому же выводу ... если я что-то пропустил, пожалуйста, дайте мне знать. –

0

попробовать это ..

select CustomerID,count(*) from [dbo].[Retail] where Itemset in(30,31) 
group by CustomerID 

Если вы хотите только результат подсчета затем использовать Common Table Expression

так:

;with cte1 
as 
(select CustomerID,count(*) as rs from [dbo].[Retail] where Itemset in(30,31) 
    group by CustomerID 
) 
select rs from cte1