列在选定列表中无效

时间:2016-11-21 13:30:12

标签: sql sql-server

我有这个标量函数:

ALTER FUNCTION [dbo].[Custom_SumKayakoMonthProfit]
    (@ClientId int, @KKId int, 
     @StartDate SmallDateTime, @EndDate SmallDatetime,
     @Month int)
RETURNS INT
AS
BEGIN
    DECLARE @Total INT

    SELECT      
        @Total = ((CAST(SUM(WorkedTimeInMinutes) AS FLOAT) / 60) * KayakoValue)
    FROM
        [VDBSERVER2012\SQLEXPRESS2014].PlaterITDB.dbo.KayakoTimeEntries
    INNER JOIN  
        ClientContract ON ClientId = @ClientId 
                       AND Workdate BETWEEN ClientContract.StartDt AND ClientContract.EndDt
    WHERE       
        OrganizationID = @KKId 
        AND WorkDate BETWEEN @StartDate AND @EndDate 
        AND MONTH(WorkDate) = @Month

    RETURN @Total
END

每当我尝试执行它以在存储过程中使用它时,我都会收到此错误。

  

列'ClientContract.KayakoValue'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

我无法弄清楚如何解决它。

2 个答案:

答案 0 :(得分:3)

你对这条消息不了解什么?您有一个没有GROUP BY的聚合查询。因此,所有列必须是聚合函数的参数。

我怀疑你打算:

SELECT @Total = CAST(SUM(WorkedTimeInMinutes * KayakoValue) AS FLOAT)/60
FROM [VDBSERVER2012\SQLEXPRESS2014].PlaterITDB.dbo.KayakoTimeEntries kte INNER JOIN
     ClientContract cc
     ON ClientId = @ClientId AND
        Workdate BETWEEN cc.StartDt AND cc.EndDt
WHERE OrganizationID = @KKId AND
      WorkDate BETWEEN @StartDate AND @EndDate AND MONTH(WorkDate) = @Month

请注意,您应该学会使用表别名并限定所有列名。这是编写可读和可维护代码的好习惯。

答案 1 :(得分:0)

你应该在总和函数中使用'KayakoValue',如sum,count ,. 。 。或者在最后的小组中。

get 'welcome', to: 'users#welcome', defaults: { id: 1 }

OR

SELECT @Total = ((CAST(SUM(WorkedTimeInMinutes) AS FLOAT)/60) * KayakoValue) FROM [VDBSERVER2012\SQLEXPRESS2014].PlaterITDB.dbo.KayakoTimeEntries INNER JOIN ClientContract ON ClientId = @ClientId AND Workdate BETWEEN ClientContract.StartDt AND ClientContract.EndDt WHERE OrganizationID = @KKId AND WorkDate BETWEEN @StartDate AND @EndDate AND MONTH(WorkDate) = @Month group by KayakoValue