相当于组_CONCAT()的SQL Server

相当于组_CONCAT()的SQL Server,sql,sql-server,join,string-aggregation,Sql,Sql Server,Join,String Aggregation,我有这个数据库: 我需要为每个客户机获取以下数据: 客户名称 合约名称 项目 从当月第一天到当月最后一天为项目记录小时数的员工 当月每位员工记录的总小时数 员工工资 每位员工的总费用(即员工费率x员工工作小时数) 每份合同的账单联系人[姓名、地址] 到目前为止,我有以下查询,但我需要实现MySQL的GROUP_CONCAT()的MSSQL版本 当我开始下面的示例时,我来到这里并停止了,因为我意识到我无法从其他子查询(projectname)引用表别名(Cr) 我该怎么做呢?试着交叉应用来实

我有这个数据库:

我需要为每个客户机获取以下数据:

  • 客户名称
  • 合约名称
  • 项目
  • 从当月第一天到当月最后一天为项目记录小时数的员工
  • 当月每位员工记录的总小时数
  • 员工工资
  • 每位员工的总费用(即员工费率x员工工作小时数)
  • 每份合同的账单联系人[姓名、地址]
到目前为止,我有以下查询,但我需要实现MySQL的GROUP_CONCAT()的MSSQL版本

当我开始下面的示例时,我来到这里并停止了,因为我意识到我无法从其他子查询(projectname)引用表别名(Cr)


我该怎么做呢?

试着交叉应用来实现这一点:

例如:

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
你喜欢这样吗

   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)

STRING_AGG几乎等同于MySQL中的GROUP_CONCAT。请参阅Microsoft的官方文档

请注意,STRING_AGG不允许使用文本类型,因此如果要在文本字段上串联,则需要转换为NVARCHAR

例如:

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
STRING_AGG(CONVERT(NVARCHAR(2000), your_text_field_name), ',')
STRING_AGG(CONVERT(NVARCHAR(2000), your_text_field_name), ',')