Case when 条件下来自另一个表的子查询

Posted

技术标签:

【中文标题】Case when 条件下来自另一个表的子查询【英文标题】:Subquery from another table in Case when condition 【发布时间】:2020-08-08 04:39:13 【问题描述】:

我正在尝试编写一个查询,我想根据作为子查询的条件对价格列求和。

我的查询:

select
  fund.FundName, 
  SUM(Case when (
        Select Top 1 bitValue 
        from table 1 
        where table1.id = Company.id and table1.field = 25
        ) = 1 then price else 0 end) as 'TotalPrice'
from
Fund left outer join Company on Company.fundId=fund.id 
group by
fund.fundName

它引发错误:无法对包含聚合或子查询的表达式执行聚合函数。

实现这一目标的最佳替代方法是什么。

【问题讨论】:

Top 1 是否存在于 mysql 中?我认为您的数据库标签错误。这可能是 Sybase 或 SQL Server。 我的错,这是一个 sql server 查询 这能回答你的问题吗? SQL Server "cannot perform an aggregate function on an expression containing an aggregate or a subquery", but Sybase can 不,这是另一个问题。我在这个子查询之外使用了 join 并且没有工作。此外,我使用的是 Top 1,但我在任何地方都找不到答案。我知道 case 不允许多个返回值。所以我想知道实现这种情况的替代方法是什么。 存在时可以试试?? 【参考方案1】:

希望这适用于您的案例:

选择 基金.基金名称, S.总价格 来自基金 LEFT OUTER JOIN COMPANY ON COMPANY.FUNDID=FUND.ID LEFT JOIN (SELECT CASE WHEN BITVALUE=1 THEN SUM(PRICE) ELSE 0 END as 'TotalPrice',table1.ID 从表 1 其中 table1.id = Company.id 和 table1.field = 25 GROUP BY table1.ID ) S ON S.ID=Company.id 通过...分组 基金.基金名称

【讨论】:

【参考方案2】:

未经测试显然没有提供样本数据。

select fund.FundName
  ,SUM(Case when table1.id is not null then price else 0 end) as 'TotalPrice'
from Fund
left outer join Company on Company.fundId = fund.id
left outer join (
    select distinct id
    from table1
    where field = 25
        and bitvalue = 1
) table1 on table1.id = Company.id
group by fund.fundName

【讨论】:

以上是关于Case when 条件下来自另一个表的子查询的主要内容,如果未能解决你的问题,请参考以下文章

CASE 表达式 - 在 WHEN 部分再添加一个条件

sql语句借助case when实现自动拼装where条件

select case when,用来判断查询

这两个case when end的条件语句查询结果为啥不一致

BigQuery - CASE WHEN x IN(来自其他表的字段),导致半连接错误

查询多个结果是用case when 条件显示列的查询效率高,还是查询后union all合并效率高.