Разделение дублирующихся строк на отдельные столбцы TSQL - PullRequest
0 голосов
/ 29 октября 2019

У меня есть блок данных, который имеет повторяющиеся идентификаторы строк (CLIENT_DIWOR - идентификатор строки), но относится к разным группам. Я не могу просто удалить дублирующую строку, так как они связываются с двумя разными группами, поэтому я пытаюсь переместить дубликат в следующий столбец, чтобы я мог получить правильные вычисления в конце моего запроса. Так что для примера того, что я после

Это то, что у меня есть

    CLIENT_DIWOR    GROUP_NAME
        -1          Priv Client Serv (Sector)
        -1          Social Business (Sector)

Это то, что я хочу

CLIENT_DIWOR    GROUP_NAME                    Second Group Name
     -1         Priv Client Serv (Sector)   Social Business (Sector)

Я пытался использовать COUNT (*) с группой, но это не дает правильных результатов, поскольку это просто скажет мне, что есть 1 из всего, и что я получаю после этого, каждый раз, когда client_DIWOR дублирует добавление 1 к предыдущему числу, так как это даст мне то, что яМне нужно разделить их и перестроить в таблицу, но я просто не вижу, как считать это, не группируя числа, это то, что я до сих пор с удаленным счетом, так как я знаю, что это неправильно.

SELECT A.CLIENT_DIWOR,B.GROUP_NAME
from CLIENT_GRP_MEMBER A 
JOIN CLIENT_GROUP B on B.DIWOR = A.CLIENT_GRP_DIWOR
order by CLIENT_DIWOR      

Ответы [ 2 ]

4 голосов
/ 29 октября 2019

Более общее решение, использующее ROW_NUMBER:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY A.CLIENT_DIWOR ORDER BY B.GROUP_NAME) rn
    FROM CLIENT_GRP_MEMBER A 
    INNER JOIN CLIENT_GROUP B
        ON B.DIWOR = A.CLIENT_GRP_DIWOR
)

SELECT
    CLIENT_DIWOR,
    MAX(CASE WHEN rn = 1 THEN GROUP_NAME END) AS GROUP_NAME,
    MAX(CASE WHEN rn = 2 THEN GROUP_NAME END) AS SECOND_GROUP_NAME
FROM cte
GROUP BY
    CLIENT_DIWOR;

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

1 голос
/ 29 октября 2019

Если вы хотите поместить две группы для каждого CLIENT_DIWOR, вы можете использовать агрегацию:

SELECT CLIENT_DIWOR,
       MIN(GROUP_NAME) as GROUP_NAME
       NULLIF(MAX(GROUP_NAME), MIN(GROUP_NAME)) as GROUP_NAME_2
from CLIENT_GRP_MEMBER cgm
GROUP BY CLIENT_DIWOR ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...