我正在使用SQL Server Management Studio,并且我正在尝试使用聚合函数创建一个视图,然后我将查询它,这样我就可以获得所需的所有数据点。
我正在查看包含以下内容的表: 联系表:
contactid 123 lastname Overflow firstname Stack
调用表:
contactid 123 starttime 3/4/2013 contactid 123 starttime 2/2/2013 contactid 123 starttime 1/3/2013
我正在尝试创建一个视图,以便我可以获得最大日期(2013年3月4日)以及contactid和name。但是,我的查询由于某种原因拉动了多个启动时间。
这就是我创建视图的方式:
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。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。
我尝试了各种方法来获得最大日期。任何帮助,将不胜感激。 谢谢!
答案 0 :(得分:2)
您的子查询返回超过1行到ca.StartTime,这对于operator =,!=,&lt;,&lt; =,&gt;,&gt; =是不可接受的,它可以由运营商IN等接受。< br />
但在您的情况下,请尝试加入子查询返回。
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
答案 1 :(得分: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