SQL在子查询上缺少表达式

时间:2017-04-26 22:35:58

标签: sql oracle

SELECT IME_ODDAJE
from ODDAJA
inner join (
  SELECT FK_ODDAJA2, COUNT(*) AS ST_GOSTOV
  FROM ODDAJA_GOST
  HAVING ST_GOSTOV > AVG(SELECT FK_ODDAJA2, COUNT(*) AS ST_GOSTOV FROM ODDAJA_GOST GROUP BY FK_ODDAJA2) t ON t.fk_oddaja2 = oddaja.ID_ODDAJA 
GROUP BY FK_ODDAJA2
);

**AVG(SELECT** FK_ODDAJA2, COUNT(*) AS ST_GOSTOV FROM ODDAJA_GOST GROUP BY FK_ODDAJA2)

在这个大胆的部分,oracle给我一个例外,那就是缺少表达式,如果有人可以帮助我,我会很高兴。

在这里,我需要在节目中统计客人,我需要在展会上挑选出比Avg客人更多的客人。

2 个答案:

答案 0 :(得分:0)

正确的语法是将聚合函数应用于选定的列而不是整个查询:

   Select avg(fk_oddaja2)
        , count(*)         As st_gostov
     From oddaja_gost
 Group by fk_oddaja2
        ;

答案 1 :(得分:0)

我建议进行迭代查询开发。从获得我们需要的结果的一部分的查询开始,并测试它,并验证它返回我们期望的结果。然后添加查询的下一部分,并测试它。当我们遇到麻烦时,请备份到我们工作的地方。

从查询获取每个节目的访客数量:

 SELECT g.fk_oddaja2
      , COUNT(*) AS st_gostov
   FROM oddaja_gost g
  GROUP BY g.fk_oddaja2

接下来,我们编写一个查询,获取每个节目的平均客人数

 SELECT AVG(c.st_gostov) AS avg_st_gostov 
   FROM (
         SELECT g.fk_oddaja2
              , COUNT(*) AS st_gostov
           FROM oddaja_gost g
          GROUP BY g.fk_oddaja2
        ) c

作为替代方案,我们可以得到整体平均值,将总客人数除以节目数:

 SELECT COUNT(t.fk_oddaja2) / COUNT(DISTINCT t.fk_oddaja2) AS avg_guests 
   FROM oddaja_gost t

接下来,我们可以使用上面的查询作为内联视图来组合两个查询(以返回大于平均值的计数),其模式如下:

SELECT ...
  FROM ( SELECT ... 
       ) a
  JOIN ( SELECT ... 
       ) c
    ON c.st_gostov > a.avg_st_gostov

或者,我们可以使用Common Table Expressions组合它们:

 WITH c AS ( SELECT g.fk_oddaja2
                  , COUNT(*) AS st_gostov
               FROM oddaja_gost g
              GROUP BY g.fk_oddaja2
           )
      a AS ( SELECT AVG(ac.st_gostov) AS avg_st_gostov
               FROM c ac
           )  
 SELECT a.avg_st_gostov
      , c.st_gostov
      , c.fk_oddaja2
   FROM c
   JOIN a
     ON c.st_gostov > a.avg_st_gostov
  ORDER BY c.st_gostov DESC

接下来,我们可以考虑将连接添加到ODDAJA表。 (好像原始查询缺少一个条件来“匹配”来自ODDAJA的行。)我们可以冒险猜测那个条件应该是什么......也许ODDAJA_GOST的FK_ODDAJA2应该与ODDAJA的ODDAJA2匹配?

 WITH c AS ( SELECT g.fk_oddaja2
                  , COUNT(*) AS st_gostov
               FROM oddaja_gost g
              GROUP BY g.fk_oddaja2
           )
      a AS ( SELECT AVG(ac.st_gostov) AS avg_st_gostov
               FROM c ac
           )  
 SELECT o.ime_oddaje
      , a.avg_st_gostov
      , c.st_gostov
      , c.fk_oddaja2 
   FROM c
   JOIN a
     ON c.st_gostov > a.avg_st_gostov
   JOIN oddaja o
     ON o.oddaja2 = c.fk_oddaja2
  ORDER BY c.st_gostov DESC 

这就是我要采取的方法:逐步迭代地构建查询,每一步都建立在上一步骤上。

有一些示例数据预期输出是有帮助的,所以我们可以测试每一步,并有一些东西可以比较我们的结果。

或者,我们可以尝试修复orignal查询中的语法。这可能会解决语法错误。 (这也可能不会返回满足规范的结果。)

SELECT IME_ODDAJE from ODDAJA inner join (SELECT FK_ODDAJA2, COUNT(*) AS ST_GOSTOV FROM ODDAJA_GOST GROUP BY FK_ODDAJA2 HAVING ST_GOSTOV > (SELECT AVG(ST_GOSTOV) FROM (SELECT FK_ODDAJA2, COUNT(*) AS ST_GOSTOV FROM ODDAJA_GOST GROUP BY FK_ODDAJA2))) ON FK_ODAJA2 = ODDAJA2 

无论。