2012-04-10 3 views
0

Я очень новой для sql.I нужна помощь в создании Summery информацииЭффективный способ генерации таблицы summery в SQL. Пожалуйста, смотрите объяснение

MemberTable

MonthID | UserID | TeamID 
----------------------------- 
    1  | 1  | 1 
    1  | 2  | 1 
    1  | 3  | 1 
    1  | 4  | 1 
    1  | 5  | 2 
    1  | 6  | 2 
    1  | 7  | 2 

И

ReportTable

ID* | MonthID | UserID | IsSend 
----------------------------------- 
1 | 1  | 2  | False 
2 | 1  | 3  | True 
3 | 1  | 5  | True 

I хочу генерировать лето не икэ следующие

TeamID  | Total Count | Send Count | Not Send Count 
----------------------------------------------------------- 
1   |  4  |  1  |  3 
2   |  3  |  1  |  2 

Общее количество: Нет пользователей в команде

Отправить Count: Всего пользователей в команде с IsSend = True

Не Отправить Графа : Всего count - Отправить почтовый адрес

Каким будет эффективный способ?

ответ

0
select MT.TeamID, 
     count(distinct MT.UserID) as "Total Count", 
     count(distinct case when RT.IsSend = 1 then MT.UserID end) as "Send Count", 
     count(distinct MT.UserID) - count(distinct case when RT.IsSend = 1 then MT.UserID end) as "Not Send Count" 
from MemberTable as MT 
    left outer join ReportTable as RT 
    on MT.MonthID = RT.MonthID and 
     MT.UserID = RT.UserID 
group by MT.TeamID 

Результат:

TeamID  Total Count Send Count Not Send Count 
----------- ----------- ----------- -------------- 
1   4   1   3 
2   3   1   2 

Попробуйте здесь: http://data.stackexchange.com/stackoverflow/query/66347

+0

Мне нравится использование проводника данных - не то, что я знал, существовал! – Dibstar

1

Дайте этому попытку:

select mt.teamId, count(*) totalCount, 
    count(case when rt.isSend = 'True' then 1 end) sendCount, 
    count(case when rt.isSend != 'True' then 1 end) notSendCount 
from memberTable mt 
join reportTable rt on mt.userId = rt.userId 
group by mt.teamId 

Обратите внимание, что ваш ожидаемый результат не отражает ваши данные. В результате на основе ваших данных должно быть:

 
+--------+------------+-----------+--------------+ 
| TEAMID | TOTALCOUNT | SENDCOUNT | NOTSENDCOUNT | 
+--------+------------+-----------+--------------+ 
|  1 |   2 |   1 |   1 | 
|  2 |   1 |   1 |   0 | 
+--------+------------+-----------+--------------+ 
+0

На самом деле пользователи, чей отчет не создан в «таблице отчетов», следует рассматривать как «не отправлять» –

0

Без havign таблиц, чтобы попробовать это, я не могу проверить, что это будет работать, но это Шоул получить вам большую часть пути:

SELECT TeamID, count(userID) as "Total count", Sum(IsSend) as "Send Count" FROM MemberTable JOIN ReportTable ON UserID GROUP BY TeamID; 
Смежные вопросы