2015-04-02 2 views
3

я следующий набор данных:Collapse и суммировать отсчеты в пределах группы по

SalesPerson PackageHistoryID PackageID SalesPersonID EnrollmentAmount PackageType 
------------------------------------------------------------------------------------------- 
Jim Jones 2895    310   59019   27.15    New Member 
Jim Jones 2895    310   59019   53.21    New Member 
Jim Jones 2895    310   59019   42.35    New Member 
Jim Jones 2916    221   59019   379.01    Renewal 
Jim Jones 2932    326   59019   53.21    New Member 
Jim Jones 2932    326   59019   27.15    New Member 
Jim Jones 2933    326   59019   53.21    Renewal 
Jim Jones 2933    326   59019   27.15    Renewal 

Upon этого набора данных я запускаю следующий запрос:

select Salesperson, PackageType, count(*) AS Packages, sum(EnrollmentAmount) AS Enrollment 
from Sales2 
group by SalesPerson, PackageType 
order by SalesPerson, PackageType 

... и я получаю эти результаты :

Salesperson PackageType Packages  Enrollment 
---------------------------------------------------- 
Jim Jones  New Member  5   203.07 
Jim Jones  Renewal  3   459.37 

Мои конечные результаты, как показано выше, почти идеальны. Единственная проблема - это подсчеты в столбце Packages. Вместо 5 и 3 подсчеты должны быть 2 и 2, потому что я хочу, чтобы он указывал количество PackageTypes на PackageHistoryID, а не на EnrollmentAmount. Я хочу, чтобы данные EnrollmentAmounts суммировались, чтобы записи могли быть сжаты, так что PackageHistoryID никогда не повторяется. Первый показанный набор данных показывает соотношение 1-много между документами PackageHistory и EnrollmentAmount. Я думал, что мой второй запрос (группа по) будет правильно агрегировать это, но вы можете видеть, что это показывает, 8 всего PackageHistories, когда это действительно необходимо показать только 4.

Вот как конечный набор результат должен выглядеть:

Salesperson PackageType Packages  Enrollment 
---------------------------------------------------- 
Jim Jones  New Member  2   203.07 
Jim Jones  Renewal  2   459.37 

2 и 2 указывают на то, что на самом деле в результирующем наборе действительно всего 4 записи PackageHistory; 2 являются новым членом и 2 являются обновлением. Записи нескольких записей EnrollmentAmount приводят к слишком большому количеству записей, и, следовательно, счетчики ошибочно расширяются в конечном запросе.

Важное примечание: Несмотря на то, что SalesPerson всегда является одним и тем же в показанных результатах, они иногда могут быть разными, хотя они будут одинаковыми для любой данной PackageHistory (1-1). Группировка должна быть (1) SalesPerson, затем (2) PackageType, и суммировать/сглаживать EnrollmentAmounts в каждой уникальной PackageHistory.

Какой запрос даст правильные результаты?

ответ

4

Вы должны сделать count(distinct PackageHistoryID) вместо count(*):

select Salesperson, PackageType, count(distinct PackageHistoryID) AS Packages, 
     sum(EnrollmentAmount) AS Enrollment 
from Sales2 
group by SalesPerson, PackageType 
order by SalesPerson, PackageType 
+0

Просто пришли сюда, чтобы сказать то же самое, так что вы получите мою +1 ​​вместо :) – LittleBobbyTables

+0

Георгиос, спасибо так много! Я делаю sql долгое время, но я не знал о count (отчетливый ...). Теперь это прекрасно! – HerrimanCoder

+1

Также мне нравится ваше имя пользователя, LittleBobbyTables. Отличный мультфильм, тот! – HerrimanCoder