Ich habe Probleme mit einem Szenario, in dem ich die PIVOT-Tabelle verwenden muss. Diese
Unten finden Sie die Quelldaten. Die erste Quellentabelle enthält Name und Mitarbeiternummer und die zweite Tabelle, die das untergeordnete Element der ersten ist, enthält Hiredate und TermDate mit EmployeeId als ForeignKey
2 Tabellen.
Mitarbeitertabelle
ID Name EmployeeNo
---- ---- ----------
1 James ABC
2 Allen DEF
Tabelle mit Mitarbeiterdetails
EmployeeId HireDate TerminationDate
---------- --------- ---------------
1 10/01/2001
2 12/31/2017 01/01/2019
erwartetes Ergebnis
JAMES JAMES HIRE DATE JAMES TERM DATE ALLEN ALLEN HIRE DATE ALLEN TERM DATE
------ --------------- --------------- ----- --------------- ---------------
ABC 10/01/2001 DEF 12/31/2017 01/01/2019
Ich konnte die folgende Bestellung einbringen
JAMES ALLEN JAMES HIRE DATE ALLEN HIRE DATE JAMES TERM DATE ALLEN TERM DATE
------ ------- --------------- --------------- --------------- ---------------
ABC DEF 10/01/2001 12/31/2017 01/01/2019
Aber mein Kunde besteht darauf, es zu erledigen
Unten ist der Code, den ich bisher habe
CREATE TABLE #Employees (
ID BIGINT
,[Name] VARCHAR(100)
,[EmployeeNo] VARCHAR(100)
);
CREATE TABLE #EmployeeHireDetails (
EmployeeId BIGINT
,HireDate DATETIME
,TermDate DATETIME
);
INSERT INTO #Employees (ID,[Name],EmployeeNo) VALUES (1,'James','ABC')
INSERT INTO #Employees (ID,[Name],EmployeeNo) VALUES (2,'Allen','DEF')
INSERT INTO #EmployeeHireDetails (EmployeeId,HireDate,TermDate) VALUES (1,DATEADD(year, -2, GETDATE()),NULL)
INSERT INTO #EmployeeHireDetails (EmployeeId,HireDate,TermDate) VALUES (2,DATEADD(year, -1, GETDATE()),DATEADD(month, -5, GETDATE()))
DECLARE @EmpName NVARCHAR(MAX) = NULL
,@EmpHireDate NVARCHAR(MAX) = NULL
,@EmpTermDate NVARCHAR(MAX) = NULL
SELECT UPPER(E.Name) AS EmployeeName
,UPPER(E.Name) + ' ' + 'HIRE DATE' AS EmployeeHireDate
,UPPER(E.Name) + ' ' + 'TERM DATE' AS EmployeeTermDate
,EmployeeNo
,EH.EmployeeId
,EH.HireDate
,EH.TermDate
INTO #Emps
FROM #Employees E WITH (NOLOCK)
INNER JOIN #EmployeeHireDetails EH WITH (NOLOCK)
ON E.ID = EH.EmployeeId
SET @EmpName = STUFF((
SELECT ',' + QUOTENAME(EmployeeName)
FROM #Emps
FOR XML PATH('')
,TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
DECLARE @EmpNameQry NVARCHAR(MAX)
SET @EmpNameQry = 'SELECT *
FROM (
SELECT E.EmployeeNo
,UPPER(E.EmployeeName) EmployeeName
--,E.EmployeeId AS EmpName_EmployeeId
FROM #Emps E
INNER JOIN #Employees EId
ON E.EmployeeId = EId.ID
) p
Pivot(Max(EmployeeNo) FOR EmployeeName IN (' + @EmpName + ')) AS Pivot_table'
EXEC sp_executesql @EmpNameQry
DECLARE @EmpHireDateQry NVARCHAR(MAX)
SET @EmpHireDate = STUFF((
SELECT ',' + QUOTENAME(EmployeeHireDate)
FROM #Emps
FOR XML PATH('')
,TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SET @EmpHireDateQry = 'SELECT *
FROM (
SELECT E.HireDate
,EmployeeHireDate
FROM #Emps E
INNER JOIN #Employees EId
ON E.EmployeeId = EId.ID
) p
Pivot(Max(HireDate) FOR EmployeeHireDate IN (' + @EmpHireDate + ')) AS Pivot_table2'
EXEC sp_executesql @EmpHireDateQry
DECLARE @EmpTermDateQry NVARCHAR(MAX)
SET @EmpTermDate = STUFF((
SELECT ',' + QUOTENAME(EmployeeTermDate)
FROM #Emps
FOR XML PATH('')
,TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SET @EmpHireDateQry = 'SELECT *
FROM (
SELECT E.TermDate
,EmployeeTermDate
FROM #Emps E
INNER JOIN #Employees EId
ON E.EmployeeId = EId.ID
) p
Pivot(Max(TermDate) FOR EmployeeTermDate IN (' + @EmpTermDate + ')) AS Pivot_table3'
EXEC sp_executesql @EmpHireDateQry
DROP TABLE #EmployeeHireDetails
DROP TABLE #Employees
DROP TABLE #Emps
Sie können einen CTE und eine bedingte Aggregation verwenden. Die Spaltennamen sind fest codiert. Möglicherweise müssen Sie eine dynamische Abfrage verwenden, um Spaltennamen zu generieren, wenn Sie die Spaltennamen nicht fest codieren können.
with jt as
(
select t1.Name, t1.EmployeeNo, t2.HireDate, t2.TerminationDate
from employee t1
inner join employeeDetails t2 on t2.EmployeeID = t1.ID
)
select
max(case when Name = 'James' then EmployeeNo end) as JAMES,
max(case when Name = 'James' then HireDate end) as 'JAMES HIRE DATE',
max(case when Name = 'James' then TerminationDate end) as 'JAMES TERMINATION DATE',
max(case when Name = 'Allen' then EmployeeNo end) as ALLEN,
max(case when Name = 'Allen' then HireDate end) as 'ALLEN HIRE DATE',
max(case when Name = 'Allen' then TerminationDate end) as 'ALLEN TERMINATION DATE'
from jt
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen