SQL视图聚合函数不是每行拉动的

时间:2013-03-28 22:36:42

标签: sql sql-server view

我正在使用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。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

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

2 个答案:

答案 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