STUFF на SQL сервере с 2 таблицами на первичном ID - PullRequest
0 голосов
/ 03 августа 2020

У меня есть 2 таблицы Contracts и Locations.

  • Contracts столбцы: CTX_ID, Parent_CTX_ID, Company_name
  • Locations столбцы: CTX_ID, State

Я пытаюсь создать выход, который объединяет СОСТОЯНИЕ в один столбец для каждого Parent_CTX_ID.

Таблица контрактов:

CTX_ID | Parent_CTX_ID | Company_Name
-------+---------------+-------------
1      | 100           | ABC
2      | 100           | ABC
3      | 100           | ABC
4      | 200           | DEF
5      | 200           | DEF
6      | 200           | DEF

Таблица местоположений:

CTX_ID | State
-------+------
1      | NJ
2      | PA
3      | DE
4      | NJ
5      | TX
6      | CA

Выход, который я пытаюсь получить:

CTX_ID | Parent_CTX_ID | Company_Name | State | States
-------+---------------+--------------+-------+-----------
1      | 100           | ABC          | NJ    | NJ,PA,DE
2      | 100           | ABC          | PA    | NJ,PA,DE
3      | 100           | ABC          | DE    | NJ,PA,DE
4      | 200           | DEF          | NJ    | NJ,TX,CA
5      | 200           | DEF          | TX    | NJ,TX,CA
6      | 200           | DEF          | CA    | NJ,TX,CA

Текущий код:

(SELECT DISTINCT 
     c.parent_ctx_id,
     STUFF((SELECT DISTINCT ',' + s.state
            FROM Locations s
            FOR XML PATH('')), 1, 1, '') as STATES
 FROM   
     Contracts AS c
 INNER JOIN 
     Locations AS s ON s.ctx_id = c.ctx_id)

Текущий выход:

Parent_CTX_ID | States
--------------+---------------
100           | CA,DE,NJ,PA,TX
200           | CA,DE,NJ,PA,TX

Ответы [ 2 ]

1 голос
/ 03 августа 2020
SELECT
  P.CTX_ID,
  P.Parent_CTX_ID,
  P.Company_Name,
  L.State,
  (
    STUFF((SELECT
      ',' + s.state as [text()]
    FROM
      Contracts AS c
      JOIN Locations AS s ON
        s.ctx_id = c.ctx_id
    WHERE
      C.Parent_CTX_ID = P.Parent_CTX_ID
    FOR XML PATH('')), 1, 1, '')
  ) States
FROM
  Contracts P
  LEFT JOIN Locations L ON
    L.CTX_ID = P.CTX_ID

SQL Fiddle

0 голосов
/ 03 августа 2020

Вы можете создать CTE для новых местоположений (с parent_ctx_id) и использовать его в своем запросе, как показано ниже:

;WITH NEW_LOCATIONS AS
(
    SELECT l.CTX_ID, l.[State], c.Parent_CTX_ID
    FROM @locations l
    JOIN @contracts c ON c.CTX_ID = l.CTX_ID
)
--SELECT * FROM new_locations
,cte AS
(
    SELECT DISTINCT c.parent_ctx_id, 
              STUFF((SELECT DISTINCT ',' + s.state
                     FROM NEW_LOCATIONS s
                     WHERE s.Parent_CTX_ID = c.Parent_CTX_ID
                     FOR XML PATH('')), 1, 1, '') as STATES
       FROM   @contracts AS c
       GROUP BY c.Parent_CTX_ID
)
--SELECT * FROM cte
SELECT c2.CTX_ID , c.Parent_CTX_ID , Company_Name , l.[State] , States 
FROM cte c
JOIN @contracts c2 ON c.parent_ctx_id = c2.Parent_CTX_ID
JOIN @locations l ON l.CTX_ID = c2.CTX_ID

Найдите здесь db <> fiddle .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...