【问题标题】:Access: Having trouble with getting average movies per day访问:无法每天获得平均电影
【发布时间】:2016-01-13 16:44:41
【问题描述】:

我在学校有一个数据库项目,我几乎完成了。我唯一需要的是平均每天的电影。我有一个观看历史记录,您可以在其中找到观看过电影的用户。说明是从观看历史中过滤掉平均每天看 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

错误:

消息 130,第 15 级,状态 1,第 1 行
无法对包含聚合或子查询的表达式执行聚合函数。

我尝试了一些不同的方法,这个查询总结了每天的电影总数。现在我需要所有内容的平均值,并且该 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)

【问题讨论】:

  • 我怀疑这个查询是否会做你真正想要的,即使你修复了语法错误。尝试编辑问题并提供示例数据和所需结果。
  • 你应该看看 AVG() 函数和 HAVING 子句。
  • 我收到错误消息,我无法对包含聚合或子查询的表达式执行聚合函数,我自己认为这确实是获取每天平均值的正确方法。但是这个错误很烦人:p
  • @TomH Yeahh 我试过了,但查询需要立即获取订阅开始日期和日期,以便它可以获取订阅开始时每天的平均值。
  • 我不确定这个,所以我不会将此作为解决方案发布,但是我认为您需要将查询“SELECT subscription_start FROM Customer”限制为特定客户。类似于“从 Customer.ID = WatchHistory.CustomerID 的客户中选择订阅开始”。然而,即使在这种情况下,我也不认为这会起作用,因为 select 是一个子查询,而 SQL Server 似乎不允许这样做。

标签: sql sql-server database ms-access average


【解决方案1】:

我看到的最大问题是您试图将子查询用作单个值。子查询可能会返回许多值,除非您的系统中只有一个客户,否则它会这样做。您应该改为 JOINing 到 Customer 表。希望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 部电影。您需要根据此进行调整。此外,您需要根据需要调整平均值的精度。

【讨论】:

  • 它显示以下错误:Msg 8121, Level 16, State 1, Line 11 列 'Customer.subscription_start' 在 HAVING 子句中无效,因为它不包含在任一聚合函数中或 GROUP BY 子句。
  • 谢谢。我已将其添加到 GROUP BY 子句中。由于它与 customer_email_address 应该是唯一的,因此它不应该影响查询。
  • 这个查询给了我每个客户每个日期的电影总数。 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)
【解决方案2】:

错误消息告诉您的是,您不能将 SUM 与 COUNT 一起使用。

尝试将 SUM(GETDATE()-(SELECT subscription_start FROM Customer)) 作为第二个聚合变量,然后

尝试在查询结束时使用 HAVING & FILTER 以仅选择 count/sum = 2 的用户

【讨论】:

  • 那么您可能需要对表 customer 和 watchhistory 进行连接,以便在查询中直接访问 subscription_start 字段。我将编辑我的帖子..
【解决方案3】:

也许这就是你需要的? 让我们加入两个表 Watchhistory 和 Customers

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

根据你的需要更改最后一行代码(我不明白你是要进还是出)

【讨论】:

  • 它说“AveragePerDag”列无效。您已自定义表名。我真的不知道你是否可以在有声明中添加它..
  • 您是否尝试使用实际定义更改 have 语句?有 count(movie_I'd) / datedif...... >2 ??
【解决方案4】:

我明白了,伙计们。最后:)

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

【讨论】:

    猜你喜欢
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多