• 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;

    "I cant stress enough the importance of switching from a sequential files mindset to set-based thinking. After you make the switch, you can spend your time tuning and optimizing your queries instead of maintaining lengthy, poor-performing code."

    -- Itzik Ben-Gan 2001