2015-09-27 89 views
2

我試圖在單個列中顯示每個標題的多個作者。此刻有一個重複的行,由於一些Titles有多於1 FirstName的事實。是否存在可用於解決此問題的一種拼接形式,並將所有作者顯示在單個字段中,並可能用逗號分隔。使用SQL查詢顯示多個值

這是我當前的查詢:

SELECT 
    Submission.Title, Researcher.FirstName, Submission.Type 
FROM 
    Submission 
INNER JOIN 
    ((Faculty 
INNER JOIN 
    School ON Faculty.FacultyID = School.[FacultyID]) 
INNER JOIN 
    (Researcher 
INNER JOIN 
    ResearcherSubmission ON Researcher.ResearcherID = ResearcherSubmission.ResearcherID) 
      ON School.SchoolID = Researcher.SchoolID) 
      ON Submission.SubmissionID = ResearcherSubmission.SubmissionID 
GROUP BY 
    Submission.Title, Researcher.FirstName, Submission.Type; 

此輸出它產生:

[current output[1]

這是我想生成輸出:

Title      FirstName       Type 
--------------------------------------------------------------------------- 
21st Century Business  Matthew, Teshar     Book Chapter 
A Family Tree...    Keshant, Lawrence     Book Chapter 
Benefits of BPM...   Jafta        Journal Article 
Business Innovation   Matthew, Morna, Teshar   Book Chapter 
+3

尋找東西和XML。 –

+0

Giorgi提出的xml子查詢是一個很好的T-SQL解決方案。我建議這是一個在應用程序代碼中更好處理的任務,因爲基本上只是爲顯示目的而格式化數據。 –

+0

我明白了。我遇到了類似的問題,其中解決方案使用XML,但我不知道如何將其納入我的情況。 http://stackoverflow.com/questions/12248899/how-can-i-concatenate-and-make-a-group-of-text-in-sql-server –

回答

3

您可以inclde一個CROSS內concantenation邏輯應用於

SELECT 
     Submission.Title 
    , CA.FirstNames 
    , Submission.Type 
FROM Submission 
     CROSS APPLY (
      SELECT 
        STUFF((
         SELECT /* DISTINCT ??? */ 
           ', ' + r.FirstName 
         FROM ResearcherSubmission rs 
           INNER JOIN Researcher r ON r.ResearcherID = rs.ResearcherID 
         WHERE Submission.SubmissionID = rs.SubmissionID 
         FOR XML PATH (''), TYPE 
         ).value('.', 'NVARCHAR(MAX)'), 1, 2, ' ') 
     ) AS CA (FirstNames) 
GROUP BY 
     Submission.Title 
    , CA.FirstNames 
    , Submission.Type 
; 

注:我不知道,如果你需要串聯的名稱時,例如包括DISTINCT到子查詢如果這些是'簡'(史密斯)和'簡'(瓊斯),你最終的名單是:'簡'還是'簡,簡'?

3

您也可以在應用程序邏輯中執行此操作。

但是,如果你想用查詢來做到這一點。你應該能夠做這樣的事:

SELECT DISTINCT 
    sm.Title, 
    STUFF(
     (SELECT  ', ' + r.FirstName 
     FROM ResearcherSubmission rs 
      INNER JOIN Researcher r ON r.ResearcherID = rs.ResearcherID 
     WHERE  sm.SubmissionID = rs.SubmissionID 
     FOR XML PATH('')), 1, 2, '') AS FirstNames, 
     sm.Type 
FROM Submission sm 
1

您可以使用下面的查詢,你從O/P,你已經得到想要生成的O/P。

CREATE TABLE #temptable(Title VARCHAR(200), FirstName VARCHAR(200), Type VARCHAR(200)) 
    INSERT INTO #temptable 
    SELECT 'Book1','Matt','Chapter' UNION 
    SELECT 'Book1','Tesh','Chapter' UNION 
    SELECT 'BPM','Jafta','Article' UNION 
    SELECT 'Ethics','William','Journal' UNION 
    SELECT 'Ethics','Lawrence','Journal' UNION 
    SELECT 'Ethics','Vincent','Journal' UNION 
    SELECT 'Cellular','Jane','Conference' 
    SELECT Title 
      ,STUFF((SELECT ', ' + CAST(FirstName AS VARCHAR(10)) [text()] 
      FROM #temptable 
      WHERE Title = t.Title 
      FOR XML PATH(''), TYPE) 
      .value('.','NVARCHAR(MAX)'),1,2,' ') List_Output 
      ,Type 
    FROM #temptable t 
    GROUP BY Title,Type 
+0

我明白了。它確實按預期顯示,但是當我使用不同的名稱和類型創建新書時會發生什麼......不是僅僅從數據庫中取出而不輸入標題,名稱和類型? –

+0

@KivanIlangakoon - 因此,我添加了一個不同名稱和類型的新條目,o/p將按預期發佈。無論如何,如果我誤解了你的意思,你可以用正確的要求編輯你的問題。 – Abhishek