T- SQL поворачивает данные и манипулирует каждой ячейкой с помощью вложенного регистра case - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь повернуть данные в SQL, и у поворотных столбцов есть разные значения.

Мне удалось получить правильные столбцы и почти все данные правильные, но не поворотные столбцы значение.

Вот мой T- SQL:

DECLARE @areaID INT
SET @areaID  = 44473 

DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(title) 
                    FROM agreements AS c
                    WHERE (c.orgID = 1893 OR (c.OrganisationId = (SELECT sc.customerOrganisationID FROM companyConfig AS sc WHERE sc.orgID = 1893) AND (c.typeID is null OR c.typeID = -1 OR c.typeID = (SELECT sc.TypeID FROM companyConfig AS sc WHERE sc.orgID = 1893))))
                    AND c.id IN(SELECT uc.agreementID from Useragreements AS uc INNER JOIN users AS u ON uc.employeeID = u.userNumber INNER JOIN participants AS sp ON u.userID = sp.userID WHERE orgID = 1893)

            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET @query = 'SELECT identity, name, ' + @cols + ' FROM 
             (
             SELECT identity, name, title, CASE WHEN COUNT(Approved) = (SELECT COUNT(psl.parentID) FROM relationLinking AS psl WHERE psl.userID = userID) THEN 2 ELSE 0 END AS approved 
             FROM(
                SELECT u1.identity, u1.userName AS name, c.title, uc.approved, row_number() over(partition by u1.userID, uc.agreementID, uc.parentID ORDER BY uc.date DESC, u1.userID) AS rn
                FROM users AS u1 INNER JOIN areaParticipant AS clp ON u1.userID = clp.userID LEFT JOIN userAgreements AS uc ON u1.userNumber = uc.employeeID FULL OUTER JOIN agreements AS c ON uc.agreementID = c.id
                WHERE clp.classTeacher = 0
                AND clp.classID = ' + CAST(@areaID AS VARCHAR(56)) + '
                ) AS tab
                WHERE rn = 1
                GROUP BY identity, name, title

            ) AS tab1 
            PIVOT 
            (
                COUNT(approved)
                for title in (' + @cols + ')
            ) p '


execute(@query)

Этот запрос выполняется и получает такой результат:

Identity  Name   Col1  Col2  Col3
1         Luke   1     0     1
2         Dart   0     0     1
3         Yoda   1     1     1

1 и нули - это неверные данные. У меня есть случай, когда я хочу указать число в поворотных столбцах. В текущем предложении CASE у меня есть 2 и 0, поэтому я не могу определить, откуда берется 1.

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

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

Identity  Name   Col1  Col2  Col3
1         Luke   2     0     1
2         Dart   0     0     3
3         Yoda   1     4     1

Где данные в поворотных столбцах может варьироваться от 0 до 4 Мы используем SQL Сервер 2016

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