我建议迭代查询一个发展的过程。从一个查询获得我们需要的结果的一部分开始,并对其进行测试,并验证它返回我们期望的结果。然后添加查询的下一部分,并对其进行测试。当我们遇到麻烦时,将我们的工作备份起来。
开始与得到的每个节目嘉宾计的查询:
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
无论哪一个。
你的问题是'AVG'之前的分号。 –
您将questin放置的方式使其看起来像第二个“粗体”avg是同一个查询的一部分,但在分号之后。但我认为你只是重复它来突出错误来自哪里?你有什么想法可以在avg()调用中进行选择?为什么加入 - 没有加入条件? –
请不要添加代码作为评论。如果您有新的信息,请编辑您的问题。并且请在问题中[请格式化您的代码](http://stackoverflow.com/help/formatting)。 –