Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查找本年度未续订的成员_Sql_Sql Server - Fatal编程技术网

Sql 查找本年度未续订的成员

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

成员资格表每年为每个成员包含1条记录(本例简化)

我希望2013年的会员在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  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 '' */