Поворот значений строк в одном столбце на основе значений в двух других столбцах - PullRequest
1 голос
/ 19 июня 2019

Чтобы расширить мой последний вопрос относительно запроса SQL или кода C #, который может поворачивать или преобразовывать значения в одном столбце в отдельные столбцы на основе данных из другого столбца:

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

Так, например, вот моя текущая таблица данных:

ID      USERID     ATTRIBUTE       ATTRIBUTE VALUE 
00001   15         Entitlement       80
00001   15         Entitlement       81
00001   15         Permission        90
00001   15         Permission        91
00001   15         Permission        92
00001   16         Entitlement       82
00001   16         Permission        93

Мне нужно, чтобы выходная таблица выглядела следующим образом:

ID      USERID        ENTITLEMENT     PERMISSION 
00001   15               80           90
00001   15               81           91
00001   15                            92
00001   16               82           93 

Где значения в столбцах ENTITLEMENT и PERMISSION сгруппированы по USERID.

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

Поворот данных с помощью T-SQLто есть

select ID, USERID, ENTITLEMENT, PERMISSION from dbo.Test_Table
pivot (Max(ATTRIBUTE VALUE) for Attribute IN ([ENTITLEMENT], [PERMISSION])) as PivotTable
order by ID asc

... не возвращает все значения из-за агрегата MAX.

Код C # в предыдущем ответе работает нормально, но,опять же, учитывается только столбец ATTRIBUTE VALUE.

Еще раз, любая помощь с этой задачей приветствуется.C # не моя сильная сторона.

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Вы можете использовать следующее с использованием DENSE_RANK

SELECT 
      CASE WHEN A.ID IS NULL THEN B.ID ELSE A.ID END AS ID,
      CASE WHEN A.USERID IS NULL THEN B.USERID ELSE A.USERID END AS USERID,
      A.[ATTRIBUTEVALUE] ENTITLEMENT,
      B.[ATTRIBUTEVALUE] PERMISSION 
FROM
    (
      SELECT *,
      DENSE_RANK() over (partition by  ATTRIBUTE order by  ATTRIBUTEVALUE)  RN1 
      FROM  <<yourtable>>
      WHERE ATTRIBUTE = 'Entitlement'
     )A
FULL OUTER JOIN
     (
      SELECT *,
      DENSE_RANK() over (partition by  ATTRIBUTE order by  ATTRIBUTEVALUE)  RN2 
      FROM <<yourtable>>
      WHERE ATTRIBUTE = 'Permission'
      )B  ON A.RN1 = B.RN2
ORDER BY 2,3

вывод выглядит следующим образом

 ID         USERID      ENTITLEMENT PERMISSION
 ---------- ----------- ----------- -----------
 00001      15          80          90
 00001      15          81          91
 00001      16          NULL        93
 00001      16          82          92

к сожалению, то, как вы хотите, чтобы данные выглядели, не будет поддерживаться PIVOT. потому что вы хотите показать несколько строк для одного и того же идентификатора и пользователя.

0 голосов
/ 19 июня 2019

Вы можете попробовать следующий скрипт, чтобы получить желаемый результат-

SELECT 
CASE WHEN A.ID IS NULL THEN B.ID ELSE A.ID END AS ID,
CASE WHEN A.USERID IS NULL THEN B.USERID ELSE A.USERID END AS USERID,
A.[ATTRIBUTE VALUE] ENTITLEMENT,
B.[ATTRIBUTE VALUE] PERMISSION 
FROM
(
    SELECT *,ROW_NUMBER() OVER(PARTITION BY USERID ORDER BY USERID) RN1 FROM your_table
    WHERE ATTRIBUTE = 'Entitlement'
)A
FULL OUTER JOIN
(
    SELECT *,ROW_NUMBER() OVER(PARTITION BY USERID ORDER BY USERID) RN2 FROM your_table
    WHERE ATTRIBUTE = 'Permission'
)B
ON A.RN1 = B.RN2 AND A.USERID = B.USERID
ORDER BY 2

Выход -

ID      USERID  ENTITLEMENT PERMISSION 
00001   15      80          90
00001   15      81          91
00001   15      NULL            92
00001   16      82          93
...