使用SQL查询显示多个值

问题描述:

我试图在单个列中显示每个标题的多个作者。此刻有一个重复的行,由于一些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://*.com/questions/12248899/how-can-i-concatenate-and-make-a-group-of-text-in-sql-server –

您可以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到子查询如果这些是'简'(史密斯)和'简'(琼斯),你最终的名单是:'简'还是'简,简'?

您也可以在应用程序逻辑中执行此操作。

但是,如果你想用查询来做到这一点。你应该能够做这样的事:

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 

您可以使用下面的查询,你从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