2016-04-19 2 views
3

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

mytable: 
TotalNumberOfRecords 
TotalDurationOfCalls 
AvgdurationPer 
TotalCallednumbers 
TotalCallednumbers 
Ratiocalledtoallcalls 

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

мой запрос, как это:

select ID, 
count(*) as TotalNumberOfRecords, 
sum (isnull(cast(duration as int),0)) {where condition1} as TotalDurationOfCalls , 
AVG(isnull(cast(duration as int),0)){where condition2} as AvgdurationPer, 
count(distinct IDS) {where condition3} as TotalCallednumbers , 
count(distinct CGI) {where condition4} as TotalOfLocations, 
cast(count(distinct IDS) as float)/cast(count(*) as float) {where condition5} as Ratiocalledtoallcalls 
from Mytable 
group by ID 

Теперь моя проблема, как я могу выполнить этот запрос в одном запросе, чтобы получить одну таблицу?

+0

Вы используете MySQL, SQL Server 2008 или SQL Server 2012? Вы отметили все три. Кроме того, мне не очень понятно, что вы просите. –

+0

Основываясь на преобладании доказательств, я сменил тег MySQL на sql. –

ответ

4

Вы хотите условную агрегацию. Вы можете сделать это, сделав case выражение: аргумент к функции агрегации:

select ID, count(*) as TotalNumberOfRecords, 
     sum(case when condition1 then cast(duration as int) else 0 end) as TotalDurationOfCalls , 
     avg(case when condition2 then cast(duration as int) else 0 end) as AvgdurationPer, 
     count(distinct case when condition3 then IDS end) as TotalCallednumbers, 
     count(distinct case when condition4 then CGI end) as TotalOfLocations, 
     cast(distinct count(case when condition5 then IDS end) as float)/cast(count(*) as float) as Ratiocalledtoallcalls 
from Mytable 
group by ID 
+0

* avg (case when condition2 then cast (duration as int) else 0 end) как AvgdurationPer *, это работа? Я думаю, что это должно быть * avg (случай, когда условие2 затем выполняется (продолжительность как int)) в качестве AvgdurationPer *, Оба будут выдавать результат diff. –

+0

@AbdulRasheed. , , Я согласен с вами в целом, но OP явно имеет замену значения «NULL» перед «AVG()». –

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