T-SQL Pivot с именами пользовательских столбцов - PullRequest
0 голосов
/ 10 января 2019

Итак, у меня есть таблица, которая выглядит так:

 User_ID |   Job_Func 
 --------------------
 Adams   |   DEV
 Adams   |   NET_ENG
 Brice   |   QA
 Cohen   |   DEV
 Cohen   |   NET_ENG
 Cohen   |   SUPERVISOR

Это должно выглядеть так

 UserName  |     Developer    |  NetworkEngineer  |   QA    |  Supervisor
 -------------------------------------------------------------------------
 Adams     |        1         |          1        |    0    |      0
 Brice     |        0         |          0        |    1    |      0
 Cohen     |        1         |          1        |    0    |      1

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

Я знаю, что нужно перечислить только 4 функции работы (возможно, 5 в будущем).

Это в конечном итоге будет использоваться для целей отчетности.

Любая помощь в этом, или просто указание мне в правильном направлении, была бы полезна.

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вы можете использовать ANSI способ сделать это, но он имеет некоторую ручную работу

SELECT DISTINCT
   USER_ID,
   (SELECT count(*) FROM TB1 WHERE TB1.JOB_FUNC = 'DEV' AND T.USER_ID = TB1.USER_ID) as Developer,
   (SELECT count(*) FROM TB1 WHERE TB1.JOB_FUNC = 'NET_ENG' AND T.USER_ID = TB1.USER_ID) as NetworkEngineer,
   (SELECT count(*) FROM TB1 WHERE TB1.JOB_FUNC = 'QA' AND T.USER_ID = TB1.USER_ID) as QA,
   (SELECT count(*) FROM TB1 WHERE TB1.JOB_FUNC = 'SUPERVISOR' AND T.USER_ID = TB1.USER_ID) as supervisor
 fROM TB1 T

или

SELECT  USER_ID,
    SUM(IFF(Job_Func = 'DEV', 1, 0)) AS Developer,
    SUM(IFF(Job_Func = 'NET_ENG', 1, 0)) AS NetworkEngineer,
    SUM(IFF(Job_Func = 'QA', 1, 0)) AS  QA,
    SUM(IFF(Job_Func = 'SUPERVISOR', 1, 0)) AS  Supervisor
FROM TB1
GROUP BY USER_ID
0 голосов
/ 10 января 2019

Простой способ для этого - использовать группирование по сумме, кейсу и регистру - вот так:

SELECT  UserName,
    SUM(CASE WHEN Job_Func = 'DEV' THEN 1 ELSE 0 END) AS Developer,
    SUM(CASE WHEN Job_Func = 'NET_ENG' THEN 1 ELSE 0 END) AS NetworkEngineer,
    SUM(CASE WHEN Job_Func = 'QA' THEN 1 ELSE 0 END) AS  QA,
    SUM(CASE WHEN Job_Func = 'SUPERVISOR' THEN 1 ELSE 0 END) AS  Supervisor
FROM TABLE_NAME
GROUP BY UserName

Если вам нужен только 1, даже если функция задания указана более одного раза, вы можете использовать MAX вместо SUM

...