2016-01-13 75 views
0

我在學校有一個數據庫項目,我快完成了。我唯一需要的是平均每天的電影。我有一個觀看歷史的地方,你可以找到觀看電影的用戶。說明性的一點是,你可以將人們從每天平均有2部電影的觀看史冊中篩選出來。訪問:在每天獲得平均電影時遇到問題

我寫了下面的SQL語句。但每次我得到錯誤。有人能幫我嗎?

SQL:

SELECT 
    customer_mail_address, 
    COUNT(movie_id) AS AantalBekeken, 
    COUNT(movie_id)/SUM(GETDATE() - 
     (SELECT subscription_start FROM Customer)) AS AveragePerDay 
FROM 
    Watchhistory 
GROUP BY 
    customer_mail_address 

錯誤:

Msg 130, Level 15, State 1, Line 1
Cannot perform an aggregate function on an expression containing an aggregate or a subquery.

我嘗試不同的東西和這個查詢總結總量電影的每天。現在我需要所有事情的平均值,而且SQL僅顯示平均每天有超過2部電影的客戶。

SELECT 
    Count(movie_id) as AantalPerDag, 
    Customer_mail_address, 
    Cast(watchhistory.watch_date as Date) as Date 
FROM 
    Watchhistory 
GROUP BY 
    customer_mail_address, Cast(watch_date as Date) 
+1

我懷疑這個查詢是否會做你真正想要的,即使你修復了語法錯誤。嘗試編輯問題並提供樣本數據和期望的結果。 –

+0

您應該看看AVG()函數和HAVING子句。 –

+0

我得到的錯誤是,我無法對包含聚合或子查詢的表達式執行聚合函數,我以爲這確實是每天獲得平均值的正確方法。但是,這個錯誤是非常煩人的:p –

回答

0

我得到了它的傢伙。最後:)

SELECT customer_mail_address, SUM(AveragePerDay)/COUNT(customer_mail_address) AS gemiddelde 
FROM   (SELECT DISTINCT customer_mail_address, COUNT(CAST(watch_date AS date)) AS AveragePerDay 
         FROM   dbo.Watchhistory 
         GROUP BY customer_mail_address, CAST(watch_date AS date)) AS d 
GROUP BY customer_mail_address 
HAVING  (SUM(AveragePerDay)/COUNT(customer_mail_address) >= 2 
0

錯誤信息告訴你的是你不能和COUNT一起使用SUM。

嘗試把SUM(GETDATE() - (SELECT subscription_start從客戶))作爲你的第二個綜合變量,並

嘗試用在查詢的末端具有&過濾器,以僅選擇具有計數的用戶/ sum = 2

+0

Nahh似乎沒有工作。正如我所描述的,出現同樣的錯誤。 –

+0

那麼您可能需要在您的表客戶和觀察歷史記錄上進行聯接,以便在查詢中直接訪問subscription_start字段。我將編輯我的帖子.. –

1

我看到的一個大問題是,您正試圖使用​​子查詢,就好像它是單個值一樣。子查詢可能會返回許多值,除非您的系統中只有一個客戶,否則它將完成此操作。您應該改爲客戶表JOIN。希望JOIN只在WatchHistory中返回每行一個客戶。如果情況並非如此,那麼你在那裏會做更多的工作。

SELECT 
    customer_mail_address, 
    COUNT(movie_id) AS AantalBekeken, 
    CAST(COUNT(movie_id) AS DECIMAL(10, 4))/DATEDIFF(dy, C.subscription_start, GETDATE()) AS AveragePerDay 
FROM 
    WatchHistory WH 
INNER JOIN Customer C ON C.customer_id = WH.customer_id -- I'm guessing at the join criteria here since no table structures were provided 
GROUP BY 
    C.customer_mail_address, 
    C.subscription_start 
HAVING 
    COUNT(movie_id)/DATEDIFF(dy, C.subscription_start, GETDATE()) <> 2 

我猜測,該標準是不是每天正是 2電影,但任何小於2或大於2。你需要調整基於這一點。此外,您需要根據您的需要調整平均值的精度。

+0

它表示以下錯誤:**消息8121,級別16,狀態1,行11 列'Customer.subscription_start'在HAVING子句中無效,因爲它不包含在聚合函數中或GROUP BY子句。** –

+0

謝謝。我已將它添加到「GROUP BY」子句中。由於它對於customer_email_address應該是唯一的,所以它不應該影響查詢。 –

+0

這個問答給了我每個客戶每個日期的總電影。 ** SELECT Count(movie_id)as AantalPerDag,Customer_mail_address,Cast(watchhistory.watch_date as Date)as Date FROM Watchhistory Group by customer_mail_address,Cast(watch_date as Date)** –

0

也許這就是你需要的? 允許連接兩個表Watchhistory和客戶

select customer_mail_address, 
COUNT(movie_id) AS AantalBekeken, 
COUNT(movie_id)/datediff(Day, GETDATE(),Customer.subscription_start) AS AveragePerDay 
from Watchhistory inner join Customer 
on Watchhistory.customer_mail_address = Customer.customer_mail_address 
GROUP BY 
    customer_mail_address 
having AveragePerDay = 2 

變化,根據你所需要的代碼的最後一行(如果你想在進出我不明白)

+0

它說列「AveragePerDag」無效。你已經創建了一個自定義表名。我真的不知道你是否可以在有聲明中加上 –

+0

你是否嘗試改變具有實際定義的聲明?計數(movie_I'd)/ datedif ......> 2? –