我正在运行一个查询,并尝试将2016年的访问量计入一个存储桶,将2017年的访问量计入另一个存储桶。代码如下所示,但我不确定为什么会出现错误:
子查询返回了多个值。当子查询跟在=、!=、〈等后面或子查询用作表达式时,不允许出现这种情况。
任何帮助或建议如何去做这将是非常感谢。谢谢。
select distinct
person.personid,
person.DOB,
person.FullName,
(select sum(events)
from Visit
where date between 20170101 and 20171231
group by PersonID) as visit2017,
(select sum(events)
from Visit
where date between 20160101 and 20161231
group by PersonID) as visit2016
into
#temp
from
table1 person
left join
table2 visit on person.personid = visit.personid
where
visit.date between 20160101 AND 20171231 ;
6条答案
按热度按时间1szpjjfi1#
你忘了将子查询限制在当前的人,但是,如果这是我的选择,我会用CTE写它,并加入它:
tf7tbtn22#
在子查询和外部查询中使用别名并添加where子句。
pjngdqdw3#
从您的查询看,它如下所示:
可以返回多个记录,因为它为每个personID返回总和(事件)。请尝试单独运行此程序,以查看它是否返回多个结果
wwtsj6pe4#
出现该错误的原因是子查询希望返回1个结果,但查询生成了多行。您可以自行运行子查询以确认错误。
您可以将子查询重构为连接
ztmd8pv55#
当你这样做的时候,通常最好是在一次选择中计算所有的年份,这样就不必多次读取表,而且如果你使用cross apply,你也不需要将结果乘以所有的事件,也不需要使用distinct。
它看起来要复杂得多,但并不难学,Case inside a sum通常很有用,使用outer apply你可以从同一个查询中得到多个结果,并将其放入最终的select中,这与select部分中的(select..)不同。
我还将between改成了两个独立的〉=和〈。Between在使用日期时可以正常工作,但如果是datetime/smalldatetime等,那么在时间不是
00:00
的最后一天,您将错过任何内容cig3rfwq6#
我假设这里有一个表Visit,其中Date、PersonID是字段,还有一个表person,其中personid、DOB和FullName是字段。
这将计算每年的访问次数