Sql 查找本年度未续订的成员
成员资格表每年为每个成员包含1条记录(本例简化) 我希望2013年的会员在2014年没有续约。这和我的逻辑一样接近,但我得到的结果是空的Sql 查找本年度未续订的成员,sql,sql-server,Sql,Sql Server,成员资格表每年为每个成员包含1条记录(本例简化) 我希望2013年的会员在2014年没有续约。这和我的逻辑一样接近,但我得到的结果是空的 SELECT Users.UserID , YEAR(Membership.MemYear) AS MemYear , Users.MailTo , Users.StreetAddress , Users.Address2 , Users.City , StateLookup.Stat
SELECT Users.UserID
, YEAR(Membership.MemYear) AS MemYear
, Users.MailTo
, Users.StreetAddress
, Users.Address2
, Users.City
, StateLookup.State
, Users.Zip
FROM Users INNER JOIN Membership
ON Users.UserID = Membership.UserID
INNER JOIN StateLookup
ON Users.StateID = StateLookup.StateID
where YEAR(Membership.MemYear) = '2013'
and not exists
(SELECT Users.UserID, YEAR(Membership.MemYear) AS MemYear
, Users.MailTo, Users.StreetAddress, Users.Address2
, Users.City, StateLookup.State, Users.Zip
FROM Users INNER JOIN Membership AS Membership_1
ON Users.UserID = Membership_1.UserID
INNER JOIN StateLookup
ON Users.StateID = StateLookup.StateID
where YEAR(Membership_1.MemYear)='2014')
感谢您的帮助!尝试更改查询的底部部分,如下所示: 您忘了引用查询的另一层。假设查询的其余部分正常,这应该可以解决该问题
SELECT Users.UserID,
YEAR(Membership.MemYear) AS MemYear,
Users.MailTo,
Users.StreetAddress,
Users.Address2,
Users.City,
StateLookup.State,
Users.Zip
FROM Users
INNER JOIN Membership
ON Users.UserID = Membership.UserID
INNER JOIN StateLookup
ON Users.StateID = StateLookup.StateID
where YEAR(Membership.MemYear) = '2013'
and not exists (SELECT x.UserID,
YEAR(Membership.MemYear) AS MemYear,
x.MailTo,
x.StreetAddress,
x.Address2,
x.City,
StateLookup.State,
x.Zip
FROM Users x
INNER JOIN Membership AS Membership_1
ON x.UserID = Membership_1.UserID
INNER JOIN StateLookup
ON x.StateID = StateLookup.StateID
where YEAR(Membership_1.MemYear) = '2014'
and x.UserID = Users.UserID)
我想如果“UserID”是唯一的,你可以这样做
SELECT Users.UserID
, YEAR(Membership.MemYear) AS MemYear
, Users.MailTo
, Users.StreetAddress
, Users.Address2
, Users.City
, StateLookup.State
, Users.Zip
FROM Users INNER JOIN Membership
ON Users.UserID = Membership.UserID
INNER JOIN StateLookup
ON Users.StateID = StateLookup.StateID
WHERE Membership.MemYear = '2013'
AND Users.UserID NOT IN
(SELECT UserID FROM Membership WHERE MemYear = '2014');
您可以使用MAX(MemYear)
查找成员年数最多为2013年的人。这意味着他们在2013年活跃,没有续约
SELECT Users.UserID
, Users.MailTo
, Users.StreetAddress
, Users.Address2
, Users.City
, StateLookup.State
, Users.Zip
FROM Users
INNER JOIN Membership
ON Users.UserID = Membership.UserID
INNER JOIN StateLookup
ON Users.StateID = StateLookup.StateID
GROUP BY Users.UserID
, Users.MailTo
, Users.StreetAddress
, Users.Address2
, Users.City
, StateLookup.State
, Users.Zip
HAVING MAX(YEAR(Membership.MemYear)) = 2013
选择Users.UserID
,年份(MemYear.MemYear)为MemYear
,Users.MailTo
,Users.StreetAddress
,Users.Address2
,用户。城市
,StateLookup.State
,Users.Zip
从用户内部加入Users.UserID=Membership.UserID上的成员身份
Users.StateID=StateLookup.StateID上的内部联接StateLookup
where YEAR(Membership.MemYear)为什么需要状态查找,“UserID”不是唯一的?成员表中MemYear列的数据类型是什么?仅供参考,在exists子查询的选择列表中选择什么并不重要,您可能认为您使用的是in子查询。修复该查询的另一种方法是更改“不存在”到“不存在”"。我添加了少于2013年或等于2013年的数据,但它不包括2014年,简单点。会员资格每年每个用户都有一个记录……这意味着你的查询可以为2014年的用户返回结果。虽然你不一定需要第二个select语句。我用显示的是而不是。@MikeSmithDev我的打赌,没有看MEMBERSHI对于重复名称的P表,您是对的,having子句解决了这个问题
SELECT Users.UserID
, Users.MailTo
, Users.StreetAddress
, Users.Address2
, Users.City
, StateLookup.State
, Users.Zip
FROM Users
INNER JOIN Membership
ON Users.UserID = Membership.UserID
INNER JOIN StateLookup
ON Users.StateID = StateLookup.StateID
GROUP BY Users.UserID
, Users.MailTo
, Users.StreetAddress
, Users.Address2
, Users.City
, StateLookup.State
, Users.Zip
HAVING MAX(YEAR(Membership.MemYear)) = 2013
SELECT Users.UserID
, YEAR(Membership.MemYear) AS MemYear
, Users.MailTo
, Users.StreetAddress
, Users.Address2
, Users.City
, StateLookup.State
, Users.Zip
FROM Users INNER JOIN Membership ON Users.UserID = Membership.UserID
INNER JOIN StateLookup ON Users.StateID = StateLookup.StateID
where YEAR(Membership.MemYear) <= 2013 /* If it Integer you don't need '' */