【问题标题】:SQL view Aggregate function not pulling per rowSQL视图聚合函数不按行拉
【发布时间】:2013-03-28 22:36:42
【问题描述】:

我正在使用 SQL Server Management Studio 并尝试使用聚合函数创建一个视图,然后我将查询该视图,以便我可以将所需的所有数据点放在一起。

我正在查看包含以下内容的表格: 联系人表:

联系方式 123 姓氏溢出 名字堆栈

调用表:

contactid 123 开始时间 2013 年 3 月 4 日 contactid 123 开始时间 2/2/2013 contactid 123 开始时间 2013 年 1 月 3 日

我正在尝试创建一个视图,以便获取最大日期(2013 年 3 月 4 日)以及联系人 ID 和姓名。但是,由于某种原因,我的查询正在拉多个开始时间。

这就是我创建视图的方式:

Create VIEW LastIntakeView
AS SELECT c.contactid, c.lastname, c.firstname, ca.starttime
FROM sfcd.dbo.Contacts c, sfcd.dbo.Calls ca
WHERE ca.starttime=(select MAX(cl.starttime)
from sfcd.dbo.Calls cl where
ContactTypeID=29 group by cl.contactid);

我收到此错误消息:Msg 512, Level 16, State 1, Line 2 子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

我尝试了各种方法来获取最大日期。任何帮助,将不胜感激。 谢谢!

【问题讨论】:

标签: sql sql-server view


【解决方案1】:

您的子查询返回超过 1 行给 ca.StartTime,这对于 operator =、!=、、>= 是不可接受的,它可以被 operator IN 等接受。

但在您的情况下,请尝试加入您的子查询返回


Create VIEW LastIntakeView
AS 
SELECT c.contactid, 
       c.lastname, 
       c.firstname, 
       cl.Maxstarttime
FROM sfcd.dbo.Contacts c
left join (
        select Contactid, MAX(starttime) as MaxStartTime
        from sfcd.dbo.Calls 
        where ContactTypeID=29 
        group by contactid
        ) cl
on c.contactid = cl.contactid

【讨论】:

    【解决方案2】:

    在子查询中,您将获得所有带有 contactType 29 的表 Calls 行。我猜这不是您想要的。

    应该这样做:

    Create VIEW LastIntakeView AS 
    SELECT c.contactid, c.lastname, c.firstname, MAX(ca.starttime) X
    FROM sfcd.dbo.Contacts c left join sfcd.dbo.Calls ca on c.contactid = ca.contactid
    where ca.ContactTypeID=29
    group by c.contactid, c.lastname, c.firstname
    

    【讨论】:

    • 我收到了这个错误,但上面的另一个答案有效。不幸的是,我不确定如何调试。谢谢你的帮助。消息 4511,级别 16,状态 1,过程 LastIntakeView1,第 2 行创建视图或函数失败,因为没有为第 4 列指定列名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 2019-01-31
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多