使用SQL查询显示多个值

时间:2015-09-27 11:33:31

标签: sql sql-server

我试图在一个列中显示每个标题的多个作者。目前有重复的行,因为有些Titles有超过1 FirstName的事实。是否有一种连接形式可用于解决此问题并在单个字段中显示所有作者,并可能用逗号分隔。

这是我目前的查询:

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 个答案:

答案 0 :(得分: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 :(得分:3)

您可以在CROSS APPLY

中包含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包含在子查询中,例如:如果这些是'简'(史密斯)和'简'(琼斯)你想要最终名单:'简'还是'简,简'?

答案 2 :(得分: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