当前位置: 首页 > 面试题库 >

SQL Server``不对包含聚合或子查询的表达式执行聚合功能'',但是Sybase可以

从经略
2023-03-14
问题内容

之前已经讨论过这个问题,但是没有一个答案可以解决我的特定问题,因为我正在处理内部和外部selects中的不同where子句。该查询在Sybase下执行得很好,但是在SQL
Server下执行时,此标题中出现错误。该查询很复杂,但是查询的总体轮廓为:

select sum ( t.graduates -
    ( select sum ( t1.graduates )
      from table as t1
      where t1.id = t.id and t1.group_code not in ('total', 'others' ) ) )
from table as t
where t.group_code = 'total'

下面介绍了我要解决的情况:

  • 除“总数”和“其他”外,所有组码均代表种族
  • 组代码“总计”代表所有种族的毕业生总数
  • 但是,缺少多种族,因此种族毕业生人数可能未加到总毕业生人数中
  • 这些丢失的数据是需要计算的

无论如何,有没有使用派生表或联接重写它以获得相同的结果?

更新:
我为我的特定问题创建了示例数据和3个解决方案(其中2个受sgeddes影响)。我添加的内容涉及将相关子查询移动到FROM子句中的派生表。感谢您的帮助!


问题答案:

一种选择是将子查询放在LEFT JOIN

select sum ( t.graduates ) - t1.summedGraduates 
from table as t
    left join 
     ( 
        select sum ( graduates ) summedGraduates, id
        from table  
        where group_code not in ('total', 'others' )
        group by id 
    ) t1 on t.id = t1.id
where t.group_code = 'total'
group by t1.summedGraduates

也许是一个更好的选择是使用SUMCASE

select sum(case when group_code = 'total' then graduates end) -
    sum(case when group_code not in ('total','others') then graduates end)
from yourtable

两者的SQL Fiddle演示



 类似资料:
  • 问题内容: 我的存储过程有问题。 我收到错误消息: 无法对包含聚合或子查询的表达式执行聚合功能 这是我认为发生错误的存储过程的一部分: 谢谢你。 问题答案: 如果您无论如何都要避免相关的子查询,通常可以得到更好的性能: 假设在Products表中最多只能有一个匹配项(Products,而不是Table_Products- 当然是一个表,因此不要在名称中加上该匹配项)。换句话说,如果product是

  • 我想用JPA编写以下查询,以检索按和分组的指令的计数。我知道以下SQL可以工作: 我想从这个查询中获取结果,并将其映射到一个新的对象调用: 问题所在

  • 问题内容: 我有一个XYZ模型,我需要获取给定查询集的字段a,b和表达式x / y的最大值。 它适用于田野。就像是: 但是,我找不到一种针对表达式的方法。尝试类似的东西: 给出一个错误: 尝试类似的东西: 给出一个错误: 甚至像: 同样不起作用,并给出与上述相同的错误: 我发现可以做到的一个技巧是: 之所以有效,是因为它会生成正确的SQL,但令人困惑,因为我确实在z属性处获得了正确的值,但没有获得

  • 我有以下JPA实体(getter、setter和非相关字段省略): 我的目标是使用JPQL或criteriaAPI实现查询,它将返回每天的平均事务量和最大事务量。 产生预期结果的原生SQL查询(MySQL数据库)如下所示: 遗憾的是,不鼓励使用本机 SQL 查询,并且 JPQL 不允许在 where 子句中使用子查询。 提前谢谢你。 附加: 我从以下Spring数据查询开始: 但显然没有用: 我可

  • >[danger] 注意!!! 使用聚合功能时,必须给它一个别名,以便能够从模型中访问它 > 聚合函数的计算,都是排除了 null 值,所以COUNT( id ) 一般推荐用非空的主键来计算 COUNT 计算数量 const { Sequelize } = app; // 查询班级总人数,按照姓名聚合 const ret = await Student.findAll({ attribut

  • 在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法,包括: 方法 说明 count 统计数量,参数是要统计的字段名(可选) max 获取最大值,参数是要统计的字段名(必须) min 获取最小值,参数是要统计的字段名(必须) avg 获取平均值,参数是要统计的字段名(必须) sum