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客人更多的客人。
答案 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
无论。