SQL: объединение строк с некоторыми условиями и удаление остальных из них - PullRequest
0 голосов
/ 08 сентября 2011

У меня есть такая таблица:

Table: PROSPECT

ID CUSTOMER NUMBER
1  A        XXXA1
1  B        XXXA1
1  G        XXX00
2  C        XXX32
2  D        XXX32
2  E        XXX32
2  F        XXX66    

Я хочу объединить имя клиента строк с ;, где они имеют одинаковые ID и NUMBER.(и удалите другие строки.)

Я хочу, чтобы это было так;

Table: PROSPECT

    ID CUSTOMER     NUMBER
    1  A;B          XXXA1
    1  G            XXX00
    2  C;D;E        XXX32
    2  F            XXX66

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 08 сентября 2011
SELECT DISTINCT ID, LEFT(T.CUSTOMER,LEN(T.CUSTOMER)-1), NUMBER
                     FROM PROSPECT A CROSS APPLY 
                            (SELECT CUSTOMER + ';' AS [text()] FROM PROSPECT B 
                                        WHERE A.ID = B.ID and A.NUMBER = B.NUMBER
                             ORDER BY ID FOR XML PATH('')) T (CUSTOMER)
1 голос
/ 08 сентября 2011

Отказ

Я согласен с @Dems, что вы не должны изменять свои нормализованные данные на это. Лучшей альтернативой может быть создание VIEW, который представляет вам данные в нужном вам формате.

Оператор SQL

CREATE VIEW dbo.VIEW_PROSPECT AS 
  SELECT  po.ID
          , STUFF((SELECT '; ' + CUSTOMER FROM PROSPECT pi WHERE pi.ID = po.ID AND pi.N  UMBER = po.NUMBER ORDER BY CUSTOMER FOR XML PATH('')),1,2,'') AS CUSTOMER
          , po.NUMBER
  FROM    PROSPECT po
  GROUP BY
          po.ID
          , po.NUMBER

Тестовый скрипт

;WITH PROSPECT(ID, CUSTOMER, NUMBER) AS (
  SELECT 1, 'A', 'XXXA1'
  UNION ALL SELECT 1, 'B', 'XXXA1'
  UNION ALL SELECT 1, 'G', 'XXX00'
  UNION ALL SELECT 2, 'C', 'XXX32'
  UNION ALL SELECT 2, 'D', 'XXX32'
  UNION ALL SELECT 2, 'E', 'XXX32'
  UNION ALL SELECT 2, 'F', 'XXX66'
)
SELECT  po.ID
        , STUFF((SELECT '; ' + CUSTOMER FROM PROSPECT pi WHERE pi.ID = po.ID AND pi.NUMBER = po.NUMBER ORDER BY CUSTOMER FOR XML PATH('')),1,2,'') AS CUSTOMER
        , po.NUMBER
FROM    PROSPECT po
GROUP BY
        po.ID
        , po.NUMBER
ORDER BY
        ID
        , CUSTOMER
        , NUMBER        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...