【问题标题】:Column is invalid error when using derived table使用派生表时列无效错误
【发布时间】:2010-10-28 15:21:17
【问题描述】:

我正在使用 ROW_NUMBER() 和派生表从派生表结果中获取数据。

但是,我收到错误消息,告诉我在 GROUP BY 子句中没有适当的列。

这是错误:

选择列表中的列 'tblCompetition.objID' 无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中

我错过了哪一栏?还是我做错了什么?在下面找到不工作的查询,以及工作的(更简单的)查询。

SQL Server 2008。

不工作的查询:

SELECT
    objID,
    objTypeID,
    userID,
    datAdded,
    count,
    sno
FROM
(
    SELECT scc.objID,scc.objTypeID,scc.userID,scc.datAdded,
       COUNT(sci.favID) as count,
    ROW_NUMBER() OVER(PARTITION BY scc.userID ORDER BY scc.unqID DESC) as sno 
    FROM tblCompetition scc
    LEFT JOIN tblFavourites sci
    ON sci.favID = scc.objID
        AND sci.datTimeStamp BETWEEN @datStart AND @datEnd
) as t
WHERE sno <= 2 AND objTypeID = @objTypeID
   AND datAdded BETWEEN @datStart AND @datEnd
GROUP BY objID,objTypeID,userID,datAdded,count,sno

正在运行的简单查询:

SELECT objId,objTypeID,userId,datAdded FROM
(
        SELECT objId,objTypeID,userId,datAdded,
    ROW_NUMBER() OVER(PARTITION BY userId ORDER BY unqid DESC) as sno 
        FROM tblResdagbokenCompetition
) as t
WHERE sno<=2 AND objtypeid=@objTypeID
    AND datAdded BETWEEN @datStart AND @datEnd

谢谢!

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您需要在子查询中使用 GROUP BY,因为这是聚合所在的位置:

    SELECT
    objID,
    objTypeID,
    userID,
    datAdded,
    count,
    sno
    FROM
    (
    SELECT scc.objID,scc.objTypeID,scc.userID,scc.datAdded,
       COUNT(sci.favID) as count,
    ROW_NUMBER() OVER(PARTITION BY scc.userID ORDER BY scc.unqID DESC) as sno 
    FROM tblCompetition scc
    LEFT JOIN tblFavourites sci
    ON sci.favID = scc.objID
        AND sci.datTimeStamp BETWEEN @datStart AND @datEnd
    GROUP BY scc.objID,scc.objTypeID,scc.userID,scc.datAdded) as t
    WHERE sno <= 2 AND objTypeID = @objTypeID
    AND datAdded BETWEEN @datStart AND @datEnd
    

    【讨论】:

      【解决方案2】:

      您不能在 group by 子句中包含计数。事实上,当您在 group by 中有其他字段时,就会得出计数。从您的 Group by 中删除计数。

      【讨论】:

        【解决方案3】:

        在您正在使用的最里面的查询中

        COUNT(sci.favID) as count,
        

        这是一个聚合,您可以选择其他非聚合列。

        我相信您想要的是 COUNT 分析:

        SELECT  objID,
                objTypeID,
                userID,
                datAdded,
                count,
                sno
        FROM    (
                SELECT  scc.objID,scc.objTypeID,scc.userID,scc.datAdded,
                        COUNT(sci.favID) OVER (PARTITION BY scc.userID ) AS count,
                        ROW_NUMBER() OVER (PARTITION BY scc.userID ORDER BY scc.unqID DESC) as sno 
                FROM    tblCompetition scc
                LEFT JOIN
                        tblFavourites sci
                ON      sci.favID = scc.objID
                        AND sci.datTimeStamp BETWEEN @datStart AND @datEnd
                ) as t
        WHERE   sno  = 1
                AND objTypeID = @objTypeID
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-06
          • 1970-01-01
          • 2016-07-11
          相关资源
          最近更新 更多