2016-11-21 30 views
0

無效我有這樣的標量函數:列在所選列表

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子句中。

我無法弄清楚如何解決它。

+4

你已經聚集'WorkedTimeInMinutes',但不是'KayakoValue' - 什麼最終的結果是你想達到什麼目的? –

+0

基本上花費的時間總成本,即WorkedTimeInMinutes * KayakoValue。 –

+0

XQbert,我試過了。 xD除非我做錯了什麼,它給了我同樣的錯誤。 –

回答

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 

請注意,您應該學會使用表別名,並限定所有列名。這是編寫可讀和可維護代碼的好習慣。

+0

我明白了這個消息,但將分鐘乘以每小時的值對我來說沒有意義。之後我忘記了我潛在的總價值,所以它確實有道理。我想,在經過這麼長時間的考慮之後,我所有的煩惱都無法得到,於是我停止思考。 xD 謝謝。有效。 –

0

您應該在sum,count,等函數中使用'KayakoValue'。 。 。或在最後一組。

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

OR

SELECT @Total = ((CAST(SUM(WorkedTimeInMinutes * KayakoValue) AS FLOAT)/60)) 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