Had a few moments to kill...
USE tempdb
GO
-- It's always good to provide sample data in an easily usable format like so
CREATE TABLE dbo.
([year] int not null,
Client_Name varchar(100) not null,
Product_Name varchar(100) not null);
INSERT dbo.
VALUES
(2014,'Bob','Hosting'),
(2014,'Bob','Development'),
(2014,'Bob','Testing'),
(2014,'Fred','Development'),
(2014,'Fred','Consulting'),
(2014,'Max','Consulting'),
(2015,'Bob','Hosting'),
(2015,'Bob','Testing');
-- Solution that Luis suggested from http://www.sqlservercentral.com/articles/comma+separated+list/71700/
WITH ClientByYear AS
(
SELECT [year], Client_Name
FROM dbo.
GROUP BY [year], Client_Name
)
SELECT
[year],
Client_Name,
list = STUFF
((
SELECT '-' + Product_Name
FROM dbo.
t
WHERE c.[year] = t.[year] AND c.Client_Name = t.Client_Name
ORDER BY Product_Name
FOR XML PATH(''), TYPE).value('.','varchar(max)'),1,1,'')
FROM ClientByYear c;
-- Itzik Ben-Gan 2001