Sql 使用条件显示列值或连接的文本,并按从分组中排除
我目前正在从事一个个人项目,我将雷曼Access棒球数据库转换为MSSQL,并针对它构建功能。我已经成功地转换了数据库,并构建了击球、投球和防守的三个静态视图 我目前正在对击球视图进行查询,以返回符合击球冠军资格的球员列表。这就是我取得的成绩: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
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;