2016-01-13 60 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? –