2017-04-26 54 views
0
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抛出了一个例外,那就是缺少表达式,如果有人可以帮我解决这个问题,我会很高兴。在子查询上缺少SQL表达式

在这里我需要在节目中统计客人,我需要挑选出比平均客人数量多的客人。

+0

你的问题是'AVG'之前的分号。 –

+0

您将questin放置的方式使其看起来像第二个“粗体”avg是同一个查询的一部分,但在分号之后。但我认为你只是重复它来突出错误来自哪里?你有什么想法可以在avg()调用中进行选择?为什么加入 - 没有加入条件? –

+1

请不要添加代码作为评论。如果您有新的信息,请编辑您的问题。并且请在问题中[请格式化您的代码](http://stackoverflow.com/help/formatting)。 –

回答

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 

或者,我们可以使用常见的将它们结合起来表格表达式:

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 

无论哪一个。

+0

谢谢你的解释在第一次我做了完全一样的,你做了前两个步骤和ODDAJA有主键ID_ODDAJA :) –

0

正确的语法是聚合函数应用到所选列,而不是整个查询:

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