Sql 使用条件显示列值或连接的文本,并按从分组中排除

Sql 使用条件显示列值或连接的文本,并按从分组中排除,sql,sql-server,Sql,Sql Server,我目前正在从事一个个人项目,我将雷曼Access棒球数据库转换为MSSQL,并针对它构建功能。我已经成功地转换了数据库,并构建了击球、投球和防守的三个静态视图 我目前正在对击球视图进行查询,以返回符合击球冠军资格的球员列表。这就是我取得的成绩: SELECT Player, Season, SUM(AB) AS AB, SUM(BB)AS BB, SUM(HBP) AS HBP, SUM(SH)AS SH, SUM(SF) AS SF, AVG(AVG)AS AVG, AVG(OBP) AS O

我目前正在从事一个个人项目,我将雷曼Access棒球数据库转换为MSSQL,并针对它构建功能。我已经成功地转换了数据库,并构建了击球、投球和防守的三个静态视图

我目前正在对击球视图进行查询,以返回符合击球冠军资格的球员列表。这就是我取得的成绩:

SELECT Player, Season, SUM(AB) AS AB, SUM(BB)AS BB, SUM(HBP) AS HBP,
SUM(SH)AS SH, SUM(SF) AS SF, AVG(AVG)AS AVG, AVG(OBP) AS OBP, 
AVG(SLG) AS SLG, AVG(OPS) AS OPS 
FROM View_PlayerBatting 
WHERE Season = '2016' 
GROUP BY Player, Season 
HAVING (SUM(AB) + SUM(BB) + SUM(HBP) + SUM(SH) + SUM(SF)) > 502 
ORDER BY AVG(OPS) DESC
我使用Order By子句对照已验证的主MLB.com检查我的结果

我的问题是,我也希望将球队包括在这个名单上,而且一些球员在赛季中期被交易,所以为了弄清楚预选赛,我不想一个队一个队分组,否则会删除七个合格的结果。但是,如果我尝试向SELECT子句中添加以下内容:

IIF(COUNT(Team) = 1, Team, CAST(COUNT(Team) AS varchar) + ' teams') AS Team 对于我的select子句,它强制我将团队包括在GROUPBY中。如果我试图使用子查询从另一个表返回值,它还强制我按组包含team by,例如:

IIF(COUNT(Team) = 1, (SELECT teamID FROM Teams where TeamID = View_PlayerBatting.Team), ...
似乎如果我需要知道团队的价值,我必须将其包含在GROUPBY子句中;如果我更改IIF的第一个结果以返回除Team列以外的其他内容,如静态值或字符串,则查询将执行,而不需要Team位于GROUP BY中。如何以我尝试使用的格式返回团队列?

我不熟悉该数据库,但您基本上希望解决每组前1个问题。您可以使用maxTeam,但这可能无法获得您想要的团队

您可以使用cross apply按TradeDate之类的列为每个球员和赛季订购一支球队,如下所示:

如果希望将每个玩家的所有团队值连接起来,可以使用


也许您可以简化数据,并显示示例数据和期望的结果。实际上,使用MAX解决了这个问题,我没有想到这一点。IIFCOUNTTeam=1,MAXTeam,CASTCOUNTTeam作为Varchar+“teams”作为团队返回团队(如果有一个团队),或者如果有多个团队返回“X个团队”。@K_Cruz太棒了!很高兴你找到了满意的解决办法。我已经更新了我的答案,将连接的团队作为另一种选择。
SELECT Player, Season, x.Team
, SUM(AB) AS AB, SUM(BB)AS BB, SUM(HBP) AS HBP,
SUM(SH)AS SH, SUM(SF) AS SF, AVG(AVG)AS AVG, AVG(OBP) AS OBP, 
AVG(SLG) AS SLG, AVG(OPS) AS OPS 
FROM View_PlayerBatting 
cross apply (
  select top 1
    Team
  from View_PlayerBatting as i 
  where i.Player = View_PlayerBatting.Player
    and i.Season = View_PlayerBatting.Season
  order by TradeDate desc
  ) as x
WHERE Season = '2016' 
GROUP BY Player, Season, x.Team
HAVING (SUM(AB) + SUM(BB) + SUM(HBP) + SUM(SH) + SUM(SF)) > 502 
ORDER BY AVG(OPS) DESC
SELECT Player, Season,
 , Team = stuff((
      select distinct '; '+i.Team
      from View_PlayerBatting as i 
      where i.Player = View_PlayerBatting.Player
        and i.Season = View_PlayerBatting.Season
      for xml path (''), type).value('.','varchar(max)')
    ,1,2,'')
  , SUM(AB) AS AB, SUM(BB)AS BB, SUM(HBP) AS HBP
  , SUM(SH)AS SH, SUM(SF) AS SF, AVG(AVG)AS AVG, AVG(OBP) AS OBP
  , AVG(SLG) AS SLG, AVG(OPS) AS OPS 
FROM View_PlayerBatting 
WHERE Season = '2016' 
GROUP BY Player, Season, x.Team
HAVING (SUM(AB) + SUM(BB) + SUM(HBP) + SUM(SH) + SUM(SF)) > 502 
ORDER BY AVG(OPS) DESC;