2014-09-12 111 views
0

查询:如何reolve对包含聚合或子查询的表达式聚合函数

SELECT * FROM TRIALTABLE1 

输出:

 PRODUCTNAME  PRICE 
     BMW   2000000 
     Yamaha R15  125000 
     Splendour Plus 60000 
     BMW   7000000 

查询#2:

select * from TRIALTABLE2 

输出:

 SRNO PRODUCTNAME 
     1  Splendour Plus 
     2  BMW 

如果我的查询是静态的

select 
    PRODUCTNAME, sum(CASE when PRODUCTNAME='BMW' then 10 else 0 END) as ID 
from TRIALTABLE1 
group by PRODUCTNAME 

它的作品。但如果我使用动态PRODUCTNAME宝马,它会引发错误..

select 
    PRODUCTNAME, sum(CASE when PRODUCTNAME= (SELECT PRODUCTNAME FROM TRIALTABLE2 WHERE SRNO=2) then 10 else 0 END) as ID 
from TRIALTABLE1 
group by PRODUCTNAME 

错误:

Lookup Error - SQL Server Database Error: Cannot perform an aggregate function on an expression containing an aggregate or a subquery

我应该如何解决这个问题?

+0

无法读取,请格式化以分离文本代码 – Bulat 2014-09-12 11:40:29

回答

1

那么,从你的例子看来,你只是需要一个左连接来避免子查询?

select t1.productname, 
     sum (case when t2.srno= 2 then 10 else 0 end) as ID 
from trialtable1 t1 
left join trialtable2 t2 on t2.productname= t1.productname 
group by t1.productname 
+0

谢谢拉斐尔Althaus,它的工作..但我仍然没有得到什么问题呢? – SonalPM 2014-09-12 11:54:41

+0

@SonalPM,正如错误消息中所述,您无法在子查询上执行SUM – 2014-09-12 12:10:38

1

作为一个说明,你可以这样写查询为:

select distinct PRODUCTNAME, 
     (SELECT sum(case when srno = 2 then 10 else 0 end) 
     FROM TRIALTABLE2 t2 
     WHERE t2.PRODUCTNAME = t1.PRODUCTNAME 
     ) as ID 
from TRIALTABLE1; 

这是为了强调,尽管你不能使用聚合函数里面的子查询,你可以使用子查询内的聚合函数。

+0

正确,但结果未由此查询分组在一起,它会为PRODUCTNAME及其价格 – SonalPM 2014-09-12 12:55:18

+0

@SonalPM生成不同的条目。 。 。这确实假设'productid'在'trialtable1'中是独一无二的,当我读到这个问题时我认为是真实的,但我错过了宝马的两个价值观。在任何情况下,所选答案都是正确的,但我想展示一种类似于原始方法的方法。 – 2014-09-12 13:28:35

+0

是的,谢谢Gordon Linoff .. – SonalPM 2014-09-15 04:55:43

相关问题