SQL Server 2012: возврат нескольких строк в одном столбце для общего идентификатора строки

Я использую 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                  Awards
puckett       1986     Gold Glove, Silver Slugger, TSN All-Star
puckett       1987     Gold Glove, Silver Slugger, TSN All-Star
puckett       1988     Gold Glove

И пробел в колонке «Награды», если в этом году не будет наград.

Coalesce не работает как есть, поскольку он не должен возвращать 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**

Заранее спасибо.

В дополнение к вкладу Ссуотера Ши ... мое выражение теперь дает это (намного лучше), однако оно возвращает ВСЕ значения, найденные в этом столбце, независимо от того, относятся ли они к этому игроку для этого идентификатора года или нет.

введите здесь описание изображения


person Paul    schedule 07.02.2014    source источник
comment
Я не могу угадать структуру вашей таблицы, можете ли вы кратко опубликовать здесь или отправить мне напрямую: [email protected]   -  person Sswater Shi    schedule 10.02.2014


Ответы (1)


Примерьте вот это:

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
person Sswater Shi    schedule 07.02.2014
comment
это отлично работало как отдельный запрос. Однако, когда я добавляю его к остальной части моего запроса, он возвращает все возможные награды, а не только 3, которые назначены этому человеку. Я не знаком с путем XML... мне придется прочитать об этом, чтобы увидеть, как это работает. - person Paul; 09.02.2014
comment
Сейчас полночь, я проверю остальную часть вашей проблемы завтра. - person Sswater Shi; 09.02.2014
comment
Без проблем. Спасибо. Спокойной ночи. - person Paul; 09.02.2014
comment
Если вы можете решить это здорово (я хотел бы научиться), но не тратьте на это неустанные усилия. Простое исправление — это ваш первый запрос к другой таблице, а затем присоединение к ней вместо таблицы AwardsPlayers, которая у меня была. - person Paul; 10.02.2014