相当于组_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员工工作小时数)
- 每份合同的账单联系人[姓名、地址]
我该怎么做呢?试着交叉应用来实现这一点: 例如:
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), ',')