2013-04-26 2 views
3

У меня есть запрос SQL, который производит следующую таблицу, но я хочу, чтобы иметь возможность получить общее для отмеченных столбцов, которые сгруппированы по категориям: enter image description hereМожно ли вычислить общее количество столбцов в группе?

вот код:

select pic.Name as Category, 
pis.Code as Code, 
pis.Name as Issue, 
count(it.ID) as 'total count', 
sum(mc.ots) as 'Imps', 
sum(case when ito.rating <50 then 1 else 0 end) as 'unfav count', 
sum(case when ito.Rating =50 then 1 else 0 end) as 'neu count', 
sum(case when ito.Rating >50 then 1 else 0 end) as 'fav count', 

(sum(case when ito.rating < 50 then 1.0 else 0.0 end)/count(it.ID) * 100) as 'unfav %', 
(sum(case when ito.Rating =50 then 1.0 else 0.0 end)/count(it.ID) * 100) as 'neu %', 
(sum(case when ito.Rating >50 then 1.0 else 0.0 end)/count(it.ID) * 100) as 'fav %', 

CONVERT(decimal(4,2),avg(ito.Rating)) as 'Av Rating %', 

count(it.id) * 100.0/sum(count(it.ID)) OVER() AS [% of Count], 
sum(mc.ots) * 100.0/sum(sum(mc.ots)) OVER() AS [% Imps] 

from 
Profiles P 
INNER JOIN ProfileResults PR ON P.ID = PR.ProfileID 
INNER JOIN Items it ON PR.ItemID = It.ID 
inner join Batches b on b.ID=it.BatchID 
left outer join BatchActionHistory bah on b.ID=bah.batchid 
inner join itemorganisations oit (nolock) on it.id=oit.itemid 
inner join itemorganisations ito (nolock) on it.id=ito.itemid 
inner join itemorganisationIssues ioi (nolock) on ito.id=ioi.itemorganisationid 
inner join ProjectIssues pis (nolock)on ioi.IssueID = pis.ID 
inner join ProjectIssueCategories pic (nolock)on pic.ID = pis.CategoryID 
inner join Lookup_ItemStatus lis (nolock) on lis.ID = it.StatusID 
inner join Lookup_BatchStatus lbs (nolock) on lbs.ID = b.StatusID 
inner join Lookup_BatchTypes bt on bt.id = b.Typeid 
inner join Lookup_MediaChannels mc on mc.id = it.MediaChannelID 


where p.ID = @profileID 
and b.StatusID IN (6,7) 
and bah.BatchActionID = 6 
and it.StatusID = 2 
and it.IsRelevant = 1 


Group BY pic.Name,pis.Name,pis.Code 
order by pic.name 

ответ

4

Вы можете сделать это, используя функцию окон sum(). Фактически вы можете установить ее с помощью обычных функций агрегации. Итак:

sum(count(it.ID)) over() as TotalCnt, 
sum(sum(mc.ots)) over() as TotalImps 

Предполагается, что вы используете SQL Server 2005 или выше.

Это делает «целую колонку». Для подгруппы, такой как те, которые определены категорией, придерживается той же идеи (как указал Александр):

sum (count (it.ID)) over (разделять по категориям) как CategoryCnt, сумма (сумма (mc.ots)) over (разделение по категориям) как CategoryImps

+0

Эта сумма составляет только суммы для этой группы или всего набора результатов? – Xerxes

+1

@xerxes в ответ, предложенный Гордоном Линнхоффем, попробуйте добавить OVER (PARTITION by pis.Code) –

+0

спасибо, это сработало :) – Xerxes

2

Описание статьи WITH ROLLUP (или комплекты группировки, доступные в последующих выпусках SQL-сервера - я не знаю, какой из них вы используете). Он будет группировать ваш вывод с помощью комбинаций столбцов от GROUP BY (группа из 3 столбцов, группа из 2 столбцов, 1 группа столбцов и общая сумма). Затем вы можете отличить группированные столбцы с GROUPING (column_name) = 1, когда он агрегирован. Надеюсь, это поможет.

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