Tsql отчетливый с подсчетом - PullRequest
3 голосов
/ 28 сентября 2011

Я использую SSMS 2008 и пытаюсь выбрать количество потребителей, которые участвуют в двух разных событиях. Возможно, это простой запрос, но в настоящее время он не возвращает ожидаемое количество. Вот мой код T-SQL, который лучше объясняет, что я пытался:

select [Program Quarter], event_name, consumer
from #consumer_initiations
where [Program Quarter] = 1  --and consumer = 'Byrd, Victoria Lynn'
group by [Program Quarter], event_name, consumer
having count (distinct event_name) > 1

Таким образом, этот запрос выше возвращает 0 записей. если я запускаю следующий запрос, я получаю все записи:

select [Program Quarter], event_name, consumer
from #consumer_initiations
where [Program Quarter] = 1

Итак, я могу видеть, где находятся некоторые из этих записей, где есть тот же квартал, тот же человек, но 2 или более событий для этого человека. Теперь, как я могу посчитать, сколько раз один и тот же человек участвует в двух или более событиях?

Ответы [ 2 ]

3 голосов
/ 28 сентября 2011

ПРИМЕЧАНИЕ. Скорее от моей головы, так что я уверен, что это можно оптимизировать:

Устраните проблему.

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

После этого подзапрос выглядит примерно так:

SELECT DISTINCT Consumer
FROM #consumer_initiations
WHERE Count(event_name) > 1

А полный запрос выглядит примерно так:

SELECT [Program Quarter], event_name, consumer   
FROM #consumer_initiations  
WHERE consumer IN (SELECT DISTINCT Consumer
FROM #consumer_initiations
WHERE Count(event_name) > 1)

Затем я бы подумал, как оптимизировать этот запрос без подзапроса..

1 голос
/ 28 сентября 2011

Я использовал вашу структуру для создания некоторых данных, которые будут генерировать некоторые выходные данные, копировать и вставлять в SSMS, если хотите.

declare @consumer_initiations table ([Program Quarter] int null, event_name varchar(100) null, consumer varchar(50) null)
insert into @consumer_initiations ([Program Quarter], event_name, consumer) values (1, 'Event 1', 'Byrd')
insert into @consumer_initiations ([Program Quarter], event_name, consumer) values (1, 'Event 2', 'Plane')
insert into @consumer_initiations ([Program Quarter], event_name, consumer) values (2, 'Event 3', 'Train')
insert into @consumer_initiations ([Program Quarter], event_name, consumer) values (3, 'Event 4', 'Stuff')
insert into @consumer_initiations ([Program Quarter], event_name, consumer) values (1, 'Event 5', 'Plane')

select [Program Quarter], event_name, consumer
from @consumer_initiations
where [Program Quarter] = 1  --and consumer = 'Byrd, Victoria Lynn'
group by [Program Quarter], event_name, consumer
having count
(distinct event_name) > 1

select [Program Quarter], event_name, consumer
from @consumer_initiations
where [Program Quarter] = 1

-- Possibly gets more information than needed

select consumer, [Program Quarter], count(event_name) as event_count
from @consumer_initiations
where [Program Quarter] = 1
group by [Program Quarter], consumer
having COUNT(event_name) > 1 

-- Just displays consumers with more than one event

select consumer, event_count from
(
select [Program Quarter], count(event_name) as event_count, consumer
from @consumer_initiations
where [Program Quarter] = 1
group by [Program Quarter], consumer
having COUNT(event_name) > 1 
) as subq

РЕЗУЛЬТАТЫ

    Program Quarter event_name                                                                                           consumer
--------------- ---------------------------------------------------------------------------------------------------- --------------------------------------------------

(0 row(s) affected)

Program Quarter event_name                                                                                           consumer
--------------- ---------------------------------------------------------------------------------------------------- --------------------------------------------------
1               Event 1                                                                                              Byrd
1               Event 2                                                                                              Plane
1               Event 5                                                                                              Plane

(3 row(s) affected)

consumer                                           Program Quarter event_count
-------------------------------------------------- --------------- -----------
Plane                                              1               2

(1 row(s) affected)

consumer                                           event_count
-------------------------------------------------- -----------
Plane                                              2

(1 row(s) affected)
...