Функция Percentile_Cont в SQL Server 2012 - проблема GROUP BY

Я весь день пытался вычислить 50-й процентиль поля, и я думаю, что приближаюсь к нему, но я немного застрял.

Это нормальный код без percentile_cont:

declare @st_date datetime;
declare @en_date datetime;
declare @days int;

set @en_date = (@en_datein);
set @st_date = (@st_datein);

select 
    srt.Name,
    cast(sum(sr.price) as int) as AvgCost,
    cast(sum(sr.cost) as int) as AvgTransCost,
    cast(avg(sr.TotalTimeSpent) as int) as TotalTimeSpent
from 
    ServiceReq sr, ServiceReqTemplate srt
where 
    sr.SvcReqTmplLink_RecID = srt.RecId
    and sr.CreatedDateTime >= @st_date
    and sr.CreatedDateTime <= @en_date
group by 
    srt.Name
order by 
    1

Это мой код, когда я добавляю percentile_cont:

declare @st_date datetime;
declare @en_date datetime;
declare @days int;

set @en_date = (@en_datein);
set @st_date = (@st_datein);

SELECT srt.Name,
    percentile_cont(.5) WITHIN GROUP(ORDER BY sr.price) OVER(PARTITION BY srt.Name) AS MedianSpend,
    cast(sum(sr.price) as int) as AvgCost,
    cast(sum(sr.cost) as int) as AvgTransCost,
    cast(avg(sr.TotalTimeSpent) as int) as TotalTimeSpent
from 
    ServiceReq sr, ServiceReqTemplate srt
where 
    sr.SvcReqTmplLink_RecID = srt.RecId
    and sr.CreatedDateTime >= @st_date
    and sr.CreatedDateTime <= @en_date
group by 
    srt.Name
order by 
    1

Если я попытаюсь выполнить это, я получаю сообщение об ошибке:

Столбец sr.price недопустим в списке выбора, поскольку не содержится ни в агрегатной функции, ни в предложении GROUP BY.

Я погуглил эту ошибку и читал о StackOverFlow, но мне еще предстоит решить эту проблему. Я попытался добавить вторую группу по, но я не понимаю, какую переменную я должен использовать, и правильно ли я это делаю !!

Как заставить код percentile_cont работать с кодом приведения в том же операторе Select ??


person QuestionQuestion    schedule 30.10.2014    source источник
comment
Отказ от вредных привычек: использование JOIN в старом стиле - этот старый стиль разделенного запятыми списка таблиц был заменен на правильный синтаксис ANSI JOIN в Стандарт ANSI- 92 SQL (более 20 лет назад), и его использование не рекомендуется.   -  person marc_s    schedule 30.10.2014
comment
это готовый отчет, который я настраиваю   -  person QuestionQuestion    schedule 30.10.2014


Ответы (1)


Я не уверен, что он даст вам желаемый результат или нет, но он исправит ошибку. попробуйте с этим

percentile_cont(.5) WITHIN GROUP(ORDER BY sum(sr.price)) OVER(PARTITION BY srt.Name) AS MedianSpend

Полное заявление

declare @st_date datetime;
declare @en_date datetime;
declare @days int;

set @en_date = (@en_datein);
set @st_date = (@st_datein);

SELECT srt.Name,
    percentile_cont(.5) WITHIN GROUP(ORDER BY sum(sr.price)) OVER(PARTITION BY srt.Name) AS MedianSpend,
    cast(sum(sr.price) as int) as AvgCost,
    cast(sum(sr.cost) as int) as AvgTransCost,
    cast(avg(sr.TotalTimeSpent) as int) as TotalTimeSpent
from 
    ServiceReq sr, ServiceReqTemplate srt
where 
    sr.SvcReqTmplLink_RecID = srt.RecId
    and sr.CreatedDateTime >= @st_date
    and sr.CreatedDateTime <= @en_date
group by 
    srt.Name
order by 
    1
person Naveen Kumar    schedule 30.10.2014
comment
Большое тебе спасибо!! Я могу запустить его, но все еще не могу отобразить медианное значение. - person QuestionQuestion; 30.10.2014
comment
скажем, мне не нужна сумма (sr.price), а вместо этого нужен только ORDER BY (sr.price), как я могу это сделать, не получая ошибки агрегированной функции. - person QuestionQuestion; 30.10.2014