Объединить несколько строк в одну строку

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

Это результаты, которые отображаются в данный момент;

<code> Type_ID | Client_ID              | PBX_Vendor |
 127     | 090820006311404926326C | Aastra     |
 127     | 090820006311404926326C | Ericsson   |
 127     | 111012237401404926326C | Aastra     |
 127     | 120209287521404926326C | Aastra     |
 127     | 120209287521404926326C | Alcatel    |
</code>

Вот как я хотел бы видеть данные;

<code> Type_ID | Client_ID              | PBX_Vendor       |
 127     | 090820006311404926326C | Aastra, Ericsson |
 127     | 111012237401404926326C | Aastra           |
 127     | 120209287521404926326C | Aastra, Alcatel  |
</code>

По сути, существует несколько поставщиков УАТС, связанных с идентификатором клиента. Мне нужен этот дисплей в одной строке для системы поддержки.

Я пытался сделать это уже с CONCAT, но все, что я в итоге получаю - это одна строка с более чем 100 поставщиками, которые не относятся к Client_ID.

Любая помощь с очень высоко ценится!

 SQLMason11 мая 2012 г., 19:34
Пожалуйста, выберите ответ в качестве правильного ответа, когда у вас есть шанс - он поможет вам быстрее / лучше получить ответы в будущем ... хорошо, не совсем, но нам нравится это говорить.

Ответы на вопрос(2)

A способ сделать это (также работает с 2005 года):

Сто

DECLARE @table TABLE
    (
      [Type_ID] INT,
      [Client_ID] VARCHAR(50),
      [PBX_Vendor] VARCHAR(50)
    )

Данны

INSERT  INTO @table
        SELECT  127,
                '090820006311404926326C',
                'Aastra'
        UNION ALL
        SELECT  127,
                '090820006311404926326C',
                'Ericsson'
        UNION ALL
        SELECT  127,
                '111012237401404926326C',
                'Aastra'
        UNION ALL
        SELECT  127,
                '120209287521404926326C',
                'Aastra'
        UNION ALL
        SELECT  127,
                '120209287521404926326C',
                'Alcatel'

Query

SELECT  [Type_ID],
        [Client_ID],
        (
          SELECT    STUFF((
                            SELECT  ',' + [PBX_Vendor]
                            FROM    @table
                            WHERE   [Client_ID] = tbl.[Client_ID]
                                    AND [Type_ID] = tbl.[Type_ID]
                            GROUP BY [PBX_Vendor]
                            ORDER BY [PBX_Vendor]
                          FOR
                            XML PATH('')
                          ), 1, 1, '')
        ) PBX_Vendor
FROM    @table tbl
GROUP BY [Type_ID],
        [Client_ID]

Результа

Type_ID     Client_ID               PBX_Vendor
127         090820006311404926326C  Aastra,Ericsson
127         111012237401404926326C  Aastra
127         120209287521404926326C  Aastra,Alcatel
 SQLMason12 мая 2012 г., 02:56
Извините, мне нужно посмотреть все данные, чтобы понять, что вы сделали. Я также написал пример в SSMS - это то, что мы все используем :) Вы вставляете свои данные в мою таблицу переменных? Если так ... не надо. Просто измените «FROM @table» на вашу таблицу в вашей базе данных в запросе (два места).
 Raddo200312 мая 2012 г., 00:35
Managed преобразовать вышеуказанное в мои таблицы, но я получаю сообщение об ошибке: «Преобразование не удалось при преобразовании значения varchar», «в тип данных int». Это должно быть потому, что у меня уже есть поиск, снятый с моего первоначального вида.
 Raddo200314 мая 2012 г., 12:20
Дэн, спасибо за вашу помощь. Я постараюсь рассказать вам немного подробнее:
 Raddo200311 мая 2012 г., 23:49
Я боюсь, я не могу заставить это работать с моим существующим кодом. Я должен добавить, что я использую Sql Management Studio для разработки, так как я не обучен SQL.
 Raddo200311 мая 2012 г., 23:50
Есть другие предложения или советы?

мне удалось заставить это работать, используя твои оригинальные Идеи с некоторыми модификациями. Хотя я не могу сохранить его как представление, так как понимаю, что вы не можете сохранить ЗАЯВЛЯЕТСЯ как ПРОСМОТРЫ;

DECLARE @table TABLE
    (
      [Type_ID] INT,
      [Client_ID] VARCHAR(50),
      [PBX_Vendor] VARCHAR(50)
    )

INSERT  INTO @table
        SELECT  dbo.AMGR_User_Fields_Tbl.Type_Id, dbo.AMGR_User_Fields_Tbl.Client_Id, dbo.AMGR_User_Field_Defs_Tbl.Description AS PBX_Vendor
            FROM    dbo.AMGR_User_Fields_Tbl INNER JOIN
                    dbo.AMGR_User_Field_Defs_Tbl ON dbo.AMGR_User_Fields_Tbl.Type_Id = dbo.AMGR_User_Field_Defs_Tbl.Type_Id AND 
                    dbo.AMGR_User_Fields_Tbl.Code_Id = dbo.AMGR_User_Field_Defs_Tbl.Code_Id
            WHERE     (dbo.AMGR_User_Fields_Tbl.Type_Id = 127)

SELECT  [Type_ID],
        [Client_ID],
        (
          SELECT    STUFF((
                            SELECT  ', ' + [PBX_Vendor]
                            FROM    @table
                            WHERE   [Client_ID] = tbl.[Client_ID]
                                    AND [Type_ID] = tbl.[Type_ID]
                            GROUP BY [PBX_Vendor]
                            ORDER BY [PBX_Vendor]
                          FOR
                            XML PATH('')
                          ), 1, 1, '')
        ) PBX_Vendor
FROM    @table tbl
GROUP BY [Type_ID],
        [Client_ID]
 SQLMason01 мая 2014 г., 04:30
не забудьте пометить мой ответ как выбранный (2 года спустя)
 SQLMason07 февр. 2017 г., 16:59
не забудьте пометить мой ответ как выбранный (5 лет спустя)

Ваш ответ на вопрос