2015-01-08 40 views
0

我有一个查询,我创建了哪个输出项目以及谁在呈现项目。我的问题是,我试图将演示者分组到项目ID,以便列出项目ID下的演示者并且不多次包含它。TSQL组按问题导致重复

这里是我的查询:

DECLARE @agendaID AS INT = '23'; 

SELECT 
    (SELECT att.empID, 
      emp.firstName, 
      emp.lastName, 
      emp.ntid 
    FROM dbo.BS_ProjectReview_Attendees AS att 
      LEFT OUTER JOIN 
      dbo.EmployeeTable AS emp 
      ON att.empID = emp.EmpID 
    WHERE att.agendaID = @agendaID 
    FOR XML PATH ('attendee'), TYPE, ELEMENTS, ROOT ('attendees')), 
    (SELECT pres.intID, 
      int.intTitle, 
      (SELECT emp.firstName, 
        emp.lastName, 
        emp.ntid 
      FROM dbo.EmployeeTable AS emp 
      WHERE emp.EmpID = pres.empID 
      FOR XML PATH ('presenter'), TYPE, ELEMENTS, ROOT ('presenters')) 
    FROM dbo.BS_ProjectReview_ProjectPresenters AS pres 
    INNER JOIN dbo.BS_Initiatives AS int 
    ON pres.intID = int.intID 
    WHERE pres.agendaID = @agendaID 
    GROUP BY int.intID <----- ISSUE IS HERE 
    FOR XML PATH ('project'), TYPE, ELEMENTS, ROOT ('projects')) 
FOR XML PATH ('data'), TYPE, ELEMENTS, ROOT ('root'); 

这里是我的XML输出:

<root> 
<data> 
<attendees> 
    <attendee> 
    <empID>1234</empID> 
    <firstName>Mike</firstName> 
    <lastName>Smith</lastName> 
    <ntid>msmith</ntid> 
    </attendee> 
</attendees> 
<projects> 
    <project> 
    <intID>202</intID> 
    <intTitle>Infrastructure Expansion</intTitle> 
    <presenters> 
     <presenter> 
     <firstName>Bob</firstName> 
     <lastName>Jones</lastName> 
     <ntid>bjones</ntid> 
     </presenter> 
    </presenters> 
    </project> 
    <project> 
    <intID>202</intID> 
    <intTitle>Infrastructure Expansion</intTitle> 
    <presenters> 
     <presenter> 
     <firstName>User 1</firstName> 
     <lastName>Last 1</lastName> 
     <ntid>ulast1</ntid> 
     </presenter> 
    </presenters> 
    </project> 
</projects> 
</data> 
</root> 

下面是所需的输出:

<root> 
<data> 
<attendees> 
    <attendee> 
    <empID>1234</empID> 
    <firstName>Mike</firstName> 
    <lastName>Smith</lastName> 
    <ntid>msmith</ntid> 
    </attendee> 
</attendees> 
<projects> 
    <project> 
    <intID>202</intID> 
    <intTitle>Infrastructure Expansion</intTitle> 
    <presenters> 
     <presenter> 
     <firstName>Bob</firstName> 
     <lastName>Jones</lastName> 
     <ntid>bjones</ntid> 
     </presenter> 
     <presenter> 
     <firstName>User 1</firstName> 
     <lastName>Last 1</lastName> 
     <ntid>ulast1</ntid> 
     </presenter> 
    </presenters> 
    </project> 
</projects> 
</data> 
</root> 

应列出下两个主持人但是它的复制方法与intID相同。

我收到一个错误的group by子句,因为它没有包含在一个聚合函数中,并且希望我包含pres.empID,但它不会使它唯一,因为它们都是不同的。

任何想法?

+0

很确定你需要@语法。见http://stackoverflow.com/questions/8483936/tsql-for-xml-explicit – Paparazzi

+0

这篇文章似乎并没有涉及到我的问题。问题在于我在问题中确定的小组小句。 – SBB

+0

为什么不发布期望的输出 – Paparazzi

回答

1

但是,这可以解决,因为SQLFiddle是关闭ATM,没有例子。

DECLARE @agendaID AS INT = '23'; 

SELECT 
    (SELECT att.empID, 
      emp.firstName, 
      emp.lastName, 
      emp.ntid 
    FROM dbo.BS_ProjectReview_Attendees AS att 
      LEFT OUTER JOIN 
      dbo.EmployeeTable AS emp 
      ON att.empID = emp.EmpID 
    WHERE att.agendaID = @agendaID 
    FOR XML PATH ('attendee'), TYPE, ELEMENTS, ROOT ('attendees')), 
    (SELECT pres.intID, 
      int.intTitle, 
      (SELECT emp.firstName, 
        emp.lastName, 
        emp.ntid 
      FROM dbo.EmployeeTable AS emp 
       INNER JOIN dbo.BS_ProjectReview_ProjectPresenters AS pres ON emp.EmpID = pres.empID 
      WHERE pres.intID = int.intID 
      FOR XML PATH ('presenter'), TYPE, ELEMENTS, ROOT ('presenters')) 
    FROM dbo.BS_Initiatives AS int 
    WHERE @agendaID IN (SELECT pres.agendaID FROM dbo.BS_ProjectReview_ProjectPresenters AS pres WHERE pres.intID = int.intID) 
    FOR XML PATH ('project'), TYPE, ELEMENTS, ROOT ('projects')) 
FOR XML PATH ('data'), TYPE, ELEMENTS, ROOT ('root');