Вопрос по sql-server-2008, sql-server – Объединить несколько строк в одну строку

4

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

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

<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.

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

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

Ваш Ответ

2   ответа
7

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
Я боюсь, я не могу заставить это работать с моим существующим кодом. Я должен добавить, что я использую Sql Management Studio для разработки, так как я не обучен SQL. Raddo2003
Есть другие предложения или советы? Raddo2003
Managed преобразовать вышеуказанное в мои таблицы, но я получаю сообщение об ошибке: «Преобразование не удалось при преобразовании значения varchar», «в тип данных int». Это должно быть потому, что у меня уже есть поиск, снятый с моего первоначального вида. Raddo2003
Извините, мне нужно посмотреть все данные, чтобы понять, что вы сделали. Я также написал пример в SSMS - это то, что мы все используем :) Вы вставляете свои данные в мою таблицу переменных? Если так ... не надо. Просто измените «FROM @table» на вашу таблицу в вашей базе данных в запросе (два места). SQLMason
Дэн, спасибо за вашу помощь. Я постараюсь рассказать вам немного подробнее: Raddo2003
0

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

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]
не забудьте пометить мой ответ как выбранный (5 лет спустя) SQLMason
не забудьте пометить мой ответ как выбранный (2 года спустя) SQLMason

Похожие вопросы