2015-11-30 77 views
0
SELECT C_SousCategorie as y, Enseigne as x, Count(DISTINCT r.Reference_Produit) as val 
       FROM RawData r, Day d 
       WHERE r.DayId = d.DayId 
        AND d.WeekNo BETWEEN MAX(d.WeekNo) AND (MAX(d.WeekNo)-2) 
       GROUP BY Enseigne, C_SousCategorie 
       ORDER BY 2, 1 ; 

上面的查詢提供了以下錯誤:SQL服務器:問題與BETWEEN子句

Lookup Error - SQL Server Database Error: An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference. 

有圍繞一個更好的辦法?我也嘗試了IN條款,但我得到了同樣的錯誤。

+5

將該條件移到'having'子句 –

+3

我也建議打破使用順序位置作爲您的訂購條件的習慣。如果您更改查詢,則必須更改where子句或查詢以不同順序返回行。明確並命名列。 –

+3

自上世紀九十年代初以來,「舊式」連接已被棄用。現在是放棄這種語法的時候了。 – Tomalak

回答

3

您不能在WHERE子句中使用聚合函數(MAX)。 WHERE子句在GROUP BY之前執行。

你有你的BETWEEN條件移動到HAVING條款:

SELECT C_SousCategorie as y, Enseigne as x, Count(DISTINCT r.Reference_Produit) as val 
FROM RawData r, Day d 
WHERE r.DayId = d.DayId 
GROUP BY Enseigne, C_SousCategorie 
HAVING d.WeekNo BETWEEN MAX(d.WeekNo) AND (MAX(d.WeekNo)-2) 

HAVING子句的GROUP BY

你也應該避免在ORDER BY使用列編號後執行,這是很危險的。

+1

它仍然無法正常工作。如果我在'HAVING'子句中使用'd.WeekNo',是否有必要在'group by'子句中使用? –

+0

錯誤:'查找錯誤 - SQL Server數據庫錯誤:列'Day.WeekNo'在HAVING子句中無效,因爲它不包含在聚合函數或GROUP BY子句中。「 –

+0

問題可能更深。您的數據庫引擎不知道如何處理WeekNo,因爲它是「使用自己」(如果有意義的話)。也許你應該分兩步做這個查詢。一,找到你想查找的WeekNo,然後用參數而不是MAX來查詢(WeekNo ... –

2

我覺得你的查詢可能使用窗口函數來獲得最大周從Day表得到更好的服務:

SELECT C_SousCategorie as y, Enseigne as x, 
     Count(DISTINCT r.Reference_Produit) as val 
FROM RawData r JOIN 
    (SELECT d.*, MAX(d.WeekNo) OVER() as maxw 
     FROM Day d 
    ) d 
    ON r.DayId = d.DayId 
WHERE d.WeekNo BETWEEN maxw - 2 AND maxw 
GROUP BY Enseigne, C_SousCategorie 
ORDER BY 2, 1 ; 

還要注意的是操作數between是錯誤的順序。較小的數字總是先走。

+0

SQL Server數據庫錯誤:關鍵字'WHERE'附近的語法不正確。'我得到這個錯誤,我沒有看到任何與語法有關的問題。 –

+0

容易,你將不得不加入一些東西,哪些東西會在where子句中發生什麼 –