私はこのデータベースを持っています:
そして、クライアントごとに次のデータを取得する必要があります。
- クライアント名
- 契約名
- プロジェクト
- 当月の初日から当月の最終日までにプロジェクトに時間を記録した従業員
- 1 か月間に各従業員が記録した総時間数
- 従業員率
- 従業員 1 人あたりの総料金 (つまり、従業員率 x 従業員の労働時間)
- 各契約の請求先 [名前、住所]
これまでのところ、次のクエリがありますが、MySQL の GROUP_CONCAT( ) の MSSQL バージョンを実装する必要があります。
SELECT
Cl.LegalName AS ClientNames,
Cr.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 )
WHERE WH_Month = 4
AND WH_Year = 2013
この例に従い始めたとき、他のサブクエリ (ProjectNames) からテーブル エイリアス (Cr) を参照できないことに気付いたので、ここにたどり着いて停止しました。
SELECT
Cl.LegalName AS ClientNames,
(
SELECT ContractDesc + ', '
FROM Contracts Cr
WHERE Cl.ClientID = Cr.ClientID
FOR XML PATH('')
) ContractNames,
(
SELECT ProjectName + ', '
FROM Projects P
WHERE Cr.ContractID = P.ContractID
FOR XML PATH('')
) ProjectNames
FROM Clients Cl
これを行うにはどうすればよいですか?