2017-06-06 36 views
1

有人可以幫我解決這個問題嗎?我需要用我的數據做兩件事。Max Date和Concatenate分開的列

  1. 我需要得到最大日
  2. 我需要連接在Proj_Use列中的值

我的數據是這樣的:

Report_Date | Program | Project | Proj_Mgr | Region | Proj_Use 

6/5/2017 | PG1 | Prj01 | Anne | East | PU1 

6/4/2017 | PG1 | Prj01 | Anne | East | PU2 

6/3/2017 | PG1 | Prj01 | Anne | East | PU3 

6/5/2017 | PG2 | Prj02 | Monica | West | PU4 

6/4/2017 | PG2 | Prj02 | Monica | West | PU5 

6/3/2017 | PG2 | Prj02 | Monica | West | PU6 

我的結果應該看起來像這個:

Report_Date Program Project Proj_MgrRegion Proj_Use 

6/5/2017 | PG1 | Prj01 | Anne | East | PU1, PU2, PU3 

6/5/2017 | PG2 | Prj02 | Monica | West | PU4, PU5, PU6 

我可以使用下面的代碼獲得最大日期:

SELECT t.[Report_Date] 
     ,t.[Program] 
     ,t.[Project] 
     ,t.[Proj_Mgr] 
     ,t.[Region] 
     ,t.[Proj_Use] 
    FROM project_table t 
    JOIN 
    (SELECT MAX([Report_Date]) as [Report Date], [Program] 
     FROM project_table 
     GROUP BY [Program]) max 
     ON t.[Report_Date] = max.[Report Date] 
     AND t.[Program] = max.[Program] 

我搜索的論壇的方式來連接,發現SQL Server的GROUP_CONCAT方法。我試着將它添加到代碼以及與此想出了:

SELECT t.[Report_Date] 
     ,t.[Program] 
     ,t.[Project] 
     ,t.[Proj_Mgr] 
     ,t.[Region] 
     ,STUFF ((
      SELECT ',' + t.[Proj_Use] 
       FROM project_table 
       FOR XML PATH ('')), 1,1, '') AS [Project Use] 
    FROM project_table t 
    JOIN 
    (SELECT MAX([Report_Date]) as [Report Date], [Program] 
     FROM project_table 
     GROUP BY [Program]) max 
     ON t.[Report_Date] = max.[Report Date] 
     AND t.[Program] = max.[Program] 

當我試圖用我的查詢運行時間超過20分鐘,而不會產生結果的真實數據來運行這個。

任何人都可以讓我知道,如果我已經正確構造這個查詢,或者如果有更好的方法來獲得我要找的結果嗎?

感謝您的幫助。

+0

其DB您正在使用? – scaisEdge

+0

sql server 2014 – matt

回答

0

你缺少的一件大事是子查詢中的where子句。使用stuff() with select ... for xml path ('') method of string concatenation

試試這個:

select 
    ReportDate = max(t.Report_Date) 
    , t.Program 
    , t.Project 
    , t.Proj_Mgr 
    , t.Region 
    , [Project_Use] = stuff((
    select ',' + i.Proj_Use 
    from project_table i 
    where i.Program = t.Program 
    and i.Project = t.Project 
    and i.Proj_Mgr = t.Proj_Mgr 
    and i.Region = t.Region 
    for xml path(''), type).value('.','nvarchar(max)') 
    , 1, 1, '') 
from project_table t 
group by t.Program, t.Project, t.Proj_Mgr, t.Region 

rextester演示:http://rextester.com/SEBKZD40038

回報:

+------------+---------+---------+----------+--------+-------------+ 
| ReportDate | Program | Project | Proj_Mgr | Region | Project_Use | 
+------------+---------+---------+----------+--------+-------------+ 
| 2017-06-04 | pg1  | Prj01 | Anne  | East | pu1,pu2,pu3 | 
| 2017-06-04 | pg2  | Prj02 | Monica | West | pu4,pu5,pu6 | 
+------------+---------+---------+----------+--------+-------------+ 
+0

這對我有用。我希望在FOR XML語句中指出任何查看解決方案的人,包括額外的關閉)。爲了使它工作,它應該看起來像這樣:for xml path(''),type).value('。','nvarchar(max)'),1,1,'')另外感謝鏈接到附加信息。很有幫助。 – matt

+0

@matt哎呀!至少在演示中它是正確的。修復了答案中的錯字。 – SqlZim

0

我期待這樣的事情:

SELECT pt.*, 
     STUFF((SELECT ',' + pt2.[Proj_Use] 
       FROM project_table pt2 
       WHERE pt2.Program = pt.Program 
       ORDER BY pt2.[Report Date] 
       FOR XML PATH ('') 
      ), 1, 1, '') AS [Projects Used] 
FROM (SELECT pt.*, 
      ROW_NUMBER() OVER (PARTITION BY Program ORDER BY [Report Date] DESC) as seqnum 
     FROM project_table t 
    ) pt 
WHERE seqnum = 1; 

至少,你的子查詢做級聯沒有相關條款對外部查詢(所以中間字符串可能會很長)。可能還有其他問題。