1

我正在使用 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);

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

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

4

2 回答 2

2

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

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


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
于 2013-03-28T23:09:56.757 回答
1

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

那应该这样做:

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
于 2013-03-28T22:42:33.817 回答