Skip to content Skip to sidebar Skip to footer

SQL Server Equivalent To GROUP_CONCAT()

I have this database: And I need to get the following data for each Client: Client Name Contract Name(s) Project(s) Employees who logged hours to a project from the first day of

Solution 1:

Try CROSS APPLY to do yhis:

For Example:

SELECT Cl.LegalName AS ClientNames,
B.ContractDesc AS ContractNames,
P.ProjectName AS ProjectNames,
( E.FirstName + ' ' + E.LastName ) AS EmployeeNames,
SUM( WH.HoursWorked ) AS TotalHours, 
( SUM( WH.HoursWorked ) * BR.Rate ) AS TotalCharges, 
( Ca.FirstName + Ca.LastName + ', ' + Ca.AddrLine1 ) AS BillingContacts

FROM Clients Cl
JOIN Contracts Cr ON( Cl.ClientID = Cr.ClientID )
JOIN Projects P ON( Cr.ContractID = P.ContractID )
JOIN EmployeesProjects EP ON( P.ProjectID = EP.ProjectID )
JOIN Employees E ON( EP.EmpID = E.EmpID )
JOIN WorkHours WH ON( E.EmpID = WH.EmpID )
JOIN BillingRates BR ON( E.TitleID = BR.TitleID ) AND ( E.Level = BR.Level )
JOIN ContractsContacts CC ON( Cr.ContractID = CC.ContractID )
JOIN Contacts Ca ON( CC.ContactID = Ca.ContactID ) 
CROSS APPLY (
    SELECT Cr1.ContractDesc + ', '
    FROM Contracts Cr1
    WHERE Cl.ClientID = Cr1.ClientID 
    FOR XML PATH('')
) B (ContractDesc)
WHERE WH_Month = 4 AND WH_Year = 2013

Solution 2:

do like this

   SELECT Cl.LegalName AS ClientNames,
   ContractNames
   FROM Clients Cl
    cross apply 
   (SELECT Cr1.ContractDesc + ', '
    FROM Contracts Cr1
      WHERE Cl.ClientID = Cr1.ClientID  For XML PATH(''))a1 (ContractNames)

Solution 3:

STRING_AGG is almost equivalent to GROUP_CONCAT in MySQL. Refer the official document from Microsoft here

Note that STRING_AGG doesn't allow Text type, so you need to convert to NVARCHAR if you will concatenate on a Text field.

Example:

STRING_AGG(CONVERT(NVARCHAR(2000), your_text_field_name), ',')

Post a Comment for "SQL Server Equivalent To GROUP_CONCAT()"