SQL Server 2012:为公共行ID在单个列中返回多个字符串

SQL Server 2012:为公共行ID在单个列中返回多个字符串,sql,coalesce,sql-server-2012-express,Sql,Coalesce,Sql Server 2012 Express,我使用的是SQL Server 2012 Express(T-SQL),我有一个表(AwardsPlayers),其中包含以下数据。我的数据库不支持MySQL。我已经看过了,但还是没弄好 如果我创建一个函数,那么在一个4表联接中,如果我在该联接中有多个聚合列作为多个聚合列中的一列,那么该函数是否可以工作 playerID awardID yearID lgID notes puckett Gold Glove 1986

我使用的是SQL Server 2012 Express(T-SQL),我有一个表(AwardsPlayers),其中包含以下数据。我的数据库不支持MySQL。我已经看过了,但还是没弄好

如果我创建一个函数,那么在一个4表联接中,如果我在该联接中有多个聚合列作为多个聚合列中的一列,那么该函数是否可以工作

playerID            awardID         yearID  lgID notes
puckett         Gold Glove          1986    AL  OF
puckett         Silver Slugger      1986    AL  OF
puckett         TSN All-Star        1986    AL  OF
puckett         Gold Glove          1987    AL  OF
puckett         Silver Slugger      1987    AL  OF
puckett         TSN All-Star        1987    AL  OF
puckett         Gold Glove          1988    AL  OF
我正在使用一个更大的联接,但是从这个表中,我希望能够返回一个查询,查询对应于该年的每个playerID和yearID

例如,从上面的表中,查询将返回以下内容:

playerID     yearID                  Awards
puckett       1986     Gold Glove, Silver Slugger, TSN All-Star
puckett       1987     Gold Glove, Silver Slugger, TSN All-Star
puckett       1988     Gold Glove
如果那一年没有奖励,奖励栏中会出现一个空白

合并不能按原样工作,因为它不返回INT,但不能对VARCHAR类型执行

我当前的查询:

--Player Stat Cards, along with Awards, Salary
select
m.namefirst,
m.namelast,
b.yearID,
b.yearID-m.birthyear as Age,
b.G,b.AB,b.R,b.H,b.[2B],b.[3B],b.HR,b.RBI,b.SB,b.BB,b.SO,left(round((b.h*1.000/b.ab),3),5) as Average
,b.IBB,b.HBP,b.SH,b.SF,b.SF,b.GIDP
, **COALESCE(a.awardID + ',' + '',0) +a.awardID**
from batting b
inner join
[master] m on b.playerID=m.playerID
inner join
AwardsPlayers a
on m.playerID=a.playerID
inner join Salaries s
on m.playerID=s.playerID
where m.playerID = 'puckett'
group by
m.namefirst,
m.namelast,
b.yearID,
b.yearID-m.birthyear,
b.G,b.AB,b.R,b.H,b.[2B],b.[3B],b.HR,b.RBI,b.SB,b.BB,b.SO,left(round((b.h*1.000/b.ab),3),5)
,b.IBB,b.HBP,b.SH,b.SF,b.SF,b.GIDP, **COALESCE(a.awardID + ',' + '',0) +a.awardID**
提前谢谢

根据Sswater Shi的贡献…我的表达式现在给出了这个(更好),但是,它返回该列中找到的所有值,无论它们是否是该玩家在该yearID中的特定值

请试试这个:

SELECT     playerID, yearID, awards = STUFF(
        (select ',' + [awardID] from AwardsPlayers t
         where playerID = AwardsPlayers.playerID
                   and yearID = AwardsPlayers.yearID
                        for xml path('')) , 1 , 1 , '')
FROM         AwardsPlayers
GROUP BY playerID, yearID

这是一个非常好的独立查询。然而,当我把它与我的查询的其余部分放在一起时,它会返回所有可能的奖励——而只返回分配给此人的3个奖励。我不熟悉XML路径…必须仔细阅读才能了解它的工作原理。现在已经是午夜了,我明天会检查您的其他问题。没问题。谢谢睡个好觉。如果你能解决这个问题,那很好(我很想学),但不要在这上面花费不懈的努力。一个简单的解决方法是首先查询另一个表,然后连接到该表,而不是我的AwardsLayers表。我猜不出您的表结构,您可以简单地在这里发布或直接发送给我:sswater@gmail.com