0

Я пытаюсь вычислить 50-й процентиль поля весь день, и я думаю, что приближаюсь, но я немного застрял.SQL Server 2012 Функция «Percentile_Cont» - GROUP BY issue

Это обычный код, без 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 

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

Column sr.price is invalid in the select list because is not contained in either an aggregate function or the GROUP BY clause

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

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

+1

[Вредные привычки пинать: использование старого стиля JOIN и] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/ 08/bad-habits-to-kick-use-old-style-joins.aspx) - стиль старого стиля * разделенный запятыми список таблиц * был заменен на * правильный * ANSI 'JOIN' синтаксис в ANSI- ** 92 ** Стандарт SQL (** более 20 лет ** назад), и его использование обескуражено –

+0

его из коробки отчет, который я настраиваю – QuestionQuestion

ответ

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 
+0

Большое спасибо! Я могу запустить его, но пока не могу показать медиану. – QuestionQuestion

+0

сказать, что мне не нужна сумма (sr.price), а вместо этого требуется только ORDER BY (sr.price), как я могу это сделать, не получая ошибку агрегатной функции. – QuestionQuestion