объединить две строки в ответном запросе как один - PullRequest
0 голосов
/ 06 августа 2011

У меня есть запрос, который возвращает людей в определенном домашнем хозяйстве, однако люди появляются в отдельных строках, и я хочу объединить две строки в одну.

SELECT     dbo.households.id, dbo.individuals.firstname, dbo.individuals.lastname
FROM         dbo.households INNER JOIN
                      dbo.individuals ON dbo.households.id = dbo.individuals.householdID
WHERE     (dbo.households.id = 10017)

Текущие результаты:

ID | First Name | Last Name |
1  | Test       | Test1     |
1  | ABC        | ABC1      |

Желаемые результаты:

ID | First Name | Last Name |ID1| First Name1| Last Name1|
1  | Test       | Test1     |1  | ABC        | ABC1      |

Однако, если будет 3 человека, тогда потребуется объединить все 3 и так далее

Ответы [ 2 ]

1 голос
/ 06 августа 2011

Если вы используете SQL Server 2005 или более позднюю версию, вы можете использовать FOR XML PATH ('') для объединения строк.

Это должно делать то, что вы хотите, без необходимости выполнять циклы вручную: edit: исправил SQL для фактической работы (теперь у меня есть доступ к SQL)

SELECT households.id, 
  STUFF(
    (
      SELECT '; ' + [firstname] + '|' + lastname AS [text()]
      FROM individuals
      WHERE individuals.householdID = households.id
      FOR XML PATH('')
    )
    , 1, 2, '' ) -- remove the first '; ' from the string
  AS [name]
FROM dbo.households
WHERE (households.id = 10017)

Это довольно близко к формату данных, который вы хотели.

он преобразует данные вXML (без какой-либо фактической разметки XML из-за PATH ('')), а затем присоединяет его обратно к строке заголовка.

1 голос
/ 06 августа 2011

В зависимости от ответа на вопрос, который я задал выше, ниже приведен простой скрипт, который скомпилирует имена в строку, а затем выведет строку (сейчас у меня нет доступа к средству проверки синтаксиса, поэтому извините за любые ошибки):

DECLARE 
    @CNT INT,
    @R_MAX INT,
    @H_ID INT,
    @R_FIRST VARCHAR(250),
    @R_LAST VARCHAR(250),
    @R_NAMES VARCHAR(MAX)

SET @CNT = 0; --Counter
SET @R_NAMES = 'Names: ';
SELECT @R_MAX = COUNT(*) FROM dbo.individuals a WHERE a.householdID = @H_ID; --Get total number of individuals
PRINT(@R_MAX); --Output # of matching rows
--Loop through table to get individuals
WHILE @CNT < @R_MAX
    BEGIN
        --Select statement
        SELECT * FROM (SELECT
            @R_FIRST = b.firstname,
            @R_LAST = b.lastname,
                       ROW_NUMBER() OVER (ORDER BY b.lastname, b.firstname) AS Row
        FROM
            dbo.households a INNER JOIN
            dbo.individuals b ON a.id = b.householdID 
        WHERE
            (a.id = @H_ID)) AS RN WHERE (Row = @CNT);

        SET @R_NAMES = @R_NAMES + @R_FIRST + @R_LAST + '; '; --Add individual's name to name string
              PRINT(CAST(@CNT AS VARCHAR) + ':' + @R_NAMES);
        SET @CNT = @CNT +1; --Increase counter
    END

PRINT(@R_NAMES); --Output the individuals
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...