Объединить и развернуть результаты на основе типа столбца в разные столбцы - PullRequest
0 голосов
/ 25 августа 2018

У меня есть ситуация здесь, и мне нужно это исправить. У меня есть две основные таблицы Персонал и ActualAdvanceDetails, В ActualAdvanceDetails есть два типа 0 и 1, что означает, что 0 является фактическим, а 1 - авансовым.

Это сохраненные данные моей таблицы фактических авансов

EmployeeId Type RefNo Id
623        0    7     1
623        1    7     2
623        0    8     3
623        1    8     4
623        1  9    5

так вот результат моего запроса

IdEMPLOYEE NAMEPOSITIONId  RefNo Id RefNo
623 Aguil , Noli Barona UNDERCARRIAGE   Welder / Fabricator 1   7      2    7
623 Aguil , Noli Barona UNDERCARRIAGE   Welder / Fabricator 1   7      4    8
623 Aguil , Noli Barona UNDERCARRIAGE   Welder / Fabricator 1   7    5  9
623 Aguil , Noli Barona UNDERCARRIAGE   Welder / Fabricator 3   8      2    7
623 Aguil , Noli Barona UNDERCARRIAGE   Welder / Fabricator 3   8      4    8
623 Aguil , Noli Barona UNDERCARRIAGE   Welder / Fabricator 3   8      5    9

должно быть

Id  EMPLOYEE NAME                       POSITION            Id  RefNo Id RefNo
623 Aguil , Noli Barona UNDERCARRIAGE   Welder / Fabricator 1   7      2    7
623 Aguil , Noli Barona UNDERCARRIAGE   Welder / Fabricator 3   8      4    8
623 Aguil , Noli Barona UNDERCARRIAGE   Welder / Fabricator            5    9

Вот мой запрос

SELECT
    Per.[EmployeeId]
    ,CONCAT(GI.LastName, ' ', GI.NameExtension,', ', GI.FirstName,' ', GI.MiddleName) AS EmployeeName
    ,S.GroupDescription As Section
    ,Pos.PositionName As Position
    ,AC.Id
    ,AC.ReferenceNo
    ,AD.Id
    ,AD.ReferenceNo
FROM [FGCIJOROSystemDB].[dbo].[Personnels] AS Per
LEFT JOIN Sections As S ON S.Id = Per.SectionId
LEFT JOIN FGCIHRDMasterlistSystemDB.dbo.EmployeesInformations AS EI ON EI.Id = Per.EmployeeId
LEFT JOIN FGCIHRDMasterlistSystemDB.dbo.GeneralInformations AS GI ON GI.Id = EI.GeneralInformationsId
LEFT JOIN FGCIHRDMasterlistSystemDB.dbo.Positions As Pos ON Pos.Id = EI.PositionsId
LEFT JOIN ActualAdvanceDetails AS AC ON AC.EmployeeId = Per.EmployeeId AND AC.Type = 0
LEFT JOIN ActualAdvanceDetails AS AD ON AD.EmployeeId = Per.EmployeeId AND AD.Type = 1
WHERE S.IsChecklistGroup = 1
ORDER BY S.GroupDescription, GI.LastName

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Рефакторинг запроса! так что это окончательный ответ! SELECT EmployeeId ,EmployeeName ,Section ,Position ,MAX(Case when Type=0 then id end) ,MAX(Case when Type=0 then ReferenceNo end) ,MAX(Case when Type=1 then id end) ,MAX(Case when Type=1 then ReferenceNo end) FROM ( SELECT EmployeeId=Per.[EmployeeId] ,EmployeeName=CONCAT(GI.LastName, ' ', GI.NameExtension,', ', GI.FirstName,' ', GI.MiddleName) ,Section=S.GroupDescription ,Position=Pos.PositionName ,id=AC.Id ,ReferenceNo=AC.ReferenceNo ,Type=AC.type ,LastName = GI.LastName FROM [FGCIJOROSystemDB].[dbo].[Personnels] AS Per LEFT JOIN Sections As S ON S.Id = Per.SectionId LEFT JOIN FGCIHRDMasterlistSystemDB.dbo.EmployeesInformations AS EI ON EI.Id = Per.EmployeeId LEFT JOIN FGCIHRDMasterlistSystemDB.dbo.GeneralInformations AS GI ON GI.Id = EI.GeneralInformationsId LEFT JOIN FGCIHRDMasterlistSystemDB.dbo.Positions As Pos ON Pos.Id = EI.PositionsId LEFT JOIN ActualAdvanceDetails AS AC ON AC.EmployeeId = Per.EmployeeId WHERE S.IsChecklistGroup = 1 ) T GROUP BY EmployeeId,EmployeeName,Section, Position,ReferenceNo ORDER BY Section, EmployeeName

0 голосов
/ 25 августа 2018

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

SELECT 
    EmployeeId
    ,EmployeeName
    ,Section
    ,Position
    ,MAX(Case when Type=0 then id end)
    ,ReferenceNo
    ,MAX(Case when Type=1 then id end)
    ,ReferenceNo
FROM
(
SELECT 
    EmployeeId=Per.[EmployeeId]
    ,EmployeeName=CONCAT(GI.LastName, ' ', GI.NameExtension,', ', GI.FirstName,' ', GI.MiddleName)
    ,Section=S.GroupDescription
    ,Position=Pos.PositionName
    ,id=AC.Id
    ,ReferenceNo=AC.ReferenceNo
    ,Type=AC.type
    ,LastName= GI.LastName
FROM [FGCIJOROSystemDB].[dbo].[Personnels] AS Per
LEFT JOIN Sections As S ON S.Id = Per.SectionId
LEFT JOIN FGCIHRDMasterlistSystemDB.dbo.EmployeesInformations AS EI ON EI.Id = Per.EmployeeId
LEFT JOIN FGCIHRDMasterlistSystemDB.dbo.GeneralInformations AS GI ON GI.Id = EI.GeneralInformationsId
LEFT JOIN FGCIHRDMasterlistSystemDB.dbo.Positions As Pos ON Pos.Id = EI.PositionsId
LEFT JOIN ActualAdvanceDetails AS AC ON AC.EmployeeId = Per.EmployeeId
WHERE S.IsChecklistGroup = 1
)
T
GROUP BY EmployeeId,EmployeeName,Section, Position,ReferenceNo
ORDER BY Section, LastName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...