2013-12-14 33 views
0

我正在嘗試執行以下查詢。而我正面臨着上述錯誤。WHERE子句,除非它位於包含在HAVING子句或選擇列表中的子查詢中

聚合可能不會出現在WHERE子句中,除非它位於包含在HAVING子句或選擇列表中的子查詢中,並且要聚合的列是外部引用。

SELECT student_id, 
     class_id, 
     item_id, 
     (SELECT stock 
     FROM dbo.daily_closing_stock_details 
     WHERE stock_reporting_date = Min(stock_reporting_date) 
       AND item_id = dcs.non_mrp_item_id) AS Stock 
FROM dbo.daily_closing_stock_details 
GROUP BY student_id, 
      sap_customer_id, 
      item_id 
+0

可能重複的[SQL查詢聚合不應出現在WHERE子句](http://stackoverflow.com/questions/7166626/sql-query-aggregate-may-not-appear-in-where-clause ) –

回答

0

你的子查詢必須只返回一行和一列,然後彙總值。見變化

SELECT student_id, 
     class_id, 
     item_id, 
     sum((SELECT sum(stock) stock 
     FROM dbo.daily_closing_stock_details 
     WHERE stock_reporting_date = stock_reporting_date 
       AND item_id = dcs.non_mrp_item_id)) AS Stock 
FROM dbo.daily_closing_stock_details 
GROUP BY student_id, 
      sap_customer_id, 
      item_id 
0

不能過濾器,在您需要使用HAVING這個更多的一致性條款聚合函數的結果從子查詢您的虛擬列應返回一個結果這把TOP 1

SELECT student_id, 
     class_id, 
     item_id, 
     (SELECT TOP 1 stock 
     FROM dbo.daily_closing_stock_details 
     HAVING stock_reporting_date = Min(stock_reporting_date) 
       AND item_id = dcs.non_mrp_item_id) AS Stock 
FROM dbo.daily_closing_stock_details 
GROUP BY student_id, 
      sap_customer_id, 
      item_id 
+1

LIMIT在SQL-Server中不可用,而是它是MySQL特定的 – Jade

+0

@Jade我的壞現在更新爲'TOP 1' –

0

試試這個:

SELECT student_id, 
    class_id, 
    item_id, 
    (SELECT stock 
    FROM dbo.daily_closing_stock_details dcs 
    WHERE item_id = dcs.non_mrp_item_id 
    HAVING stock_reporting_date = Min(stock_reporting_date)) as Stock 
FROM dbo.daily_closing_stock_details 
GROUP BY student_id, 
     sap_customer_id, 
     item_id 
0

你必須使用別名,否則SQLServer假定stock_reporting_date列(在這種情況下y)子查詢表的一部分:

SELECT x.student_id, 
     x.class_id, 
     x.item_id, 
     (SELECT y.stock 
     FROM dbo.daily_closing_stock_details y 
     WHERE y.stock_reporting_date = Min(x.stock_reporting_date) 
       AND y.item_id = x.item_id) AS Stock 
     -- I used x.item_id column instead of non_mrp_item_id 
     -- If you have to use x.non_mrp_item_id instead of x.item_id then you need to replace this column within GROUP BY clause 
FROM dbo.daily_closing_stock_details x 
GROUP BY x.student_id, 
      x.sap_customer_id, 
      x.item_id 

而且,在這種情況下,你需要在ITEM_ID和stock_reporting_date列的UNIQUE索引,否則,你需要使用一個聚合函數(MIN,MAX等:(SELECT MAX(y.stock) ...)或TOP((SELECT TOP(1) y.stock ... ORDER BY ...))在子​​查詢中。

0

不知道爲什麼你使用組by.you可以在我的query.Also刪除查詢

AND item_id = dcs.non_mrp_item_id 

是不明確的,可以將其包含。只是使它發揮作用。

Select student_id, 
    class_id, 
    item_id, 
    stock 
FROM dbo.daily_closing_stock_details 
WHERE stock_reporting_date =(select Min(stock_reporting_date) FROM dbo.daily_closing_stock_details GROUP BY student_id, 
      sap_customer_id, 
      item_id )