2013-10-01 34 views
4

我有這個數據庫:SQL服務器相當於GROUP_CONCAT()

enter image description here

,我需要得到以下數據每個客戶:

  • 客戶名稱
  • 合同名稱
  • 該項目(s)
  • 名員工誰登錄小時將項目從當月的第一天至當月最後一天
  • 月期間記錄的每一個員工
  • 員工比率
  • 每位員工的總費用總小時數(即員工比率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 

當我開始以下this例子,我到這裏停了下來,因爲我意識到,我不能引用來自其他子查詢(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 

我該如何去做這件事?

+1

的可能重複(http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-功能功能於微軟的SQL服務器2005年) – podiluska

回答

1

嘗試CROSS APPLY做yhis:

例如:

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 
1

做這樣

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) 
0

STRING_AGG幾乎等同於在MySQL GROUP_CONCAT。請參閱Microsoft的官方文檔here

請注意,STRING_AGG不允許使用文本類型,因此如果要在文本字段上連接,則需要轉換爲NVARCHAR。

例如:[?模擬組\ _concat在Microsoft SQL Server 2005中的MySQL函數]

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