求和、计数和转换 - "cannot perform an aggregate function on an expression containing an aggregate or a subquery"

SUM, Count, and convert - "cannot perform an aggregate function on an expression containing an aggregate or a subquery"

我正在尝试将一个 varchar 列,即 "Alert" 转换为小数,以便我可以将 "Alert" 的计数除以 "Alerts" 的 SUM 或总计每天按模型类型获取警报百分比....我有以下查询,但我收到错误“无法对包含聚合或子查询的表达式执行聚合函数”。

  1. 如错误提示,您不能直接对另一个聚合执行聚合函数。
  2. 要做到这一点,你必须先统计结果,然后在外部查询中使用求和函数。
  3. 也可以在外部查询中使用不带 groupby 的 Sum() 来获取所有记录的总和。
with cte as(
select 
vehicle_model,
Alert
,count(Alert) as 'Count_of_Alerts'
,date
from MyTable
group by vehicle_model,date,Alert
)

select 
vehicle_model
,Alert
,date
,cast(Convert(decimal(18,2),(cast([Count_of_Alerts] as float)/cast(Summa as float)*100)) as varchar)+'%' as Percent_of_Alert
,[Count_of_Alerts]
from
(
    select c.vehicle_model,c.Alert,[Count_of_Alerts],Summa
    ,c.date
    from cte c
    left join
    (
    (select vehicle_model,date,Sum(cte.[Count_of_Alerts]) as Summa from cte group by vehicle_model,date)
    )A ON A.date=c.date AND A.vehicle_model=c.vehicle_model
)YY

我想你只是想要条件聚合:

select vehicle_model, date,
       sum(case when Alter = 'true' then 1 else 0 end) as num_alerts,
       avg(case when Alter = 'true' then 100.0 else 0 end) as percent_alerts
from MyTable
group by vehicle_model, date;

如果您想要不同行的警报,则:

select vehicle_model, date, alert,
       count(*) as cnt,
       count(*) * 100.0 / sum(count(*)) over (partition by vehicle_model, date) as percentage
from MyTable
group by vehicle_model, date, alert;