SQL Server嵌套查询问题

时间:2013-04-30 15:45:56

标签: sql sql-server database nested-query

我目前正在尝试使用嵌套子查询来过滤嵌套循环的每一层的行。我这样做的原因是因为查询是由用户在应用程序级别进行的,并且过滤器的顺序是由它们构造的。

以下是可以使用界面创建的查询示例:

SELECT AVG(value) As Average, STDEV(value) As Standard_Deviation, DATEPART(mm,date) As Month 
FROM sqlTable
WHERE value IN 
    (SELECT TOP 2000 STDEV(value) FROM sqlTable WHERE value IN
        (SELECT TOP 10000 AVG(value) FROM sqlTable ORDER BY AVG(value))
    ORDER BY STDEV(value) Desc)
GROUP BY name_column1, name_column2, DATEPART(mm, Date);

只有一个表sqlTable,唯一相关的列是valuecolumn1column2date

如果用户决定他们可以在层次结构中向上移动STDEV功能。因此,行首先由STDEV过滤(或者移动到最远的嵌套查询)。此查询当前未返回任何结果,当我向选择的嵌套查询添加value时,我收到一条错误消息,指出它是无效列。

错误:

is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

非常感谢任何帮助。谢谢!

修改 过滤在一个表上,包含数百万个金融项目记录,并允许用户查看哪些商品(column_name1和column_name2)最有利可图,风险最小(包括其他功能)。我使用嵌套查询的原因是因为获得基于AVG的TOP 10000,然后从该结果返回基于STDEV的前2000,然后获得基于STDEV的TOP 10000并且基于此返回TOP 2000 AVG。我希望用户能够按照他们的意愿订购计算,并且可以使用更多嵌套查询。

SELECT AVG(value) As Average, STDEV(value) As Standard_Deviation, DATEPART(mm,Date) As Month 
FROM sqlTable
WHERE value IN 
    (SELECT TOP 2000 STDEV(value) FROM sqlTable WHERE value IN
        (SELECT TOP 10000 column_name1, column_name2, value, AVG(value) FROM sqlTable
        GROUP BY column_name1, column_name2, value ORDER BY AVG(value))
    GROUP BY column_name1, column_name2, value
    ORDER BY STDEV(value))
GROUP BY column_name1, column_name2, DATEPART(mm, Date);

返回上面的第二个错误。

2 个答案:

答案 0 :(得分:2)

使用GROUP BY时,SELECT子句中的每一列都必须通过聚合函数定义(如MAXMINAVG, ......)或必须包含在GROUP BY条款中。

答案 1 :(得分:1)

in语句中的查询没有意义:

WHERE value IN 
    (SELECT TOP 2000 STDEV(value) FROM sqlTable WHERE value IN
        (SELECT TOP 10000 AVG(value) FROM sqlTable ORDER BY AVG(value))
    ORDER BY STDEV(value) Desc)

表达式使用聚合函数(stdev()),但没有对应的group by。所以这只会返回一行。 <{1}}是不必要的。

也许您希望从外部top 2000获得stdev()。但它不会那样工作。在group by之前处理where。如果您想要后续结果,那么您需要一个group by子句。但having子句无法与having本身进行比较。

我建议您提出另一个问题来解释过滤和嵌套正在做什么。如上所述,我无法看到此查询的特定用途。一个值极不可能出现在标准偏差列表中。即使这些值确实非常接近,微小的数值差异也会使value无法正常工作。