【问题标题】:SUM, Count, and convert - "cannot perform an aggregate function on an expression containing an aggregate or a subquery"SUM、Count 和 convert - “无法对包含聚合或子查询的表达式执行聚合函数”
【发布时间】:2020-06-14 09:34:55
【问题描述】:

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

【问题讨论】:

    标签: sql sql-server group-by aggregation


    【解决方案1】:

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

    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;
    

    【讨论】:

    • @Empyz 。 . .您不喜欢这种更简单的解决方案吗?我很惊讶你没有接受它。
    • 抱歉,这是我最终使用的刚刚更改的版本
    【解决方案2】:
    1. 正如错误提示的那样,您不能直接对另一个聚合执行聚合函数。
    2. 为此,您必须先计算结果,然后在外部查询中使用 sum 函数。
    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
    

    【讨论】:

    • 嗨 - 谢谢,我能够运行此查询,但我想我的逻辑不正确,因为数字似乎与我想要做的不匹配。从本质上讲,我试图每天按车型类型获取“警报”的百分比。看起来查询应该执行功能(按型号类型的警报数量)/(所有车辆型号的警报总数),但不是吗?
    • @Empyz 如果您发布一些示例数据和您期望的输出将会很有帮助。
    • 我刚刚添加了一些示例数据并更新了我的原始帖子。你能看一下吗?
    • @Empyz 检查我编辑的答案。它服务于您的目的。请接受它作为答案并投票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多