Ich habe unter Abfrage funktioniert wie erwartet, aber lange dauern, um auszuführen.Optimierung der SQL Server-Abfrage mit #temp Tabelle und Gruppe nach Bedingung
Ergebnis zu erreichen, ich habe die Datensätze in temporärer Tabelle geholt und dann groupby angewandt Endergebnis
SELECT *
INTO #temp From (
select A.*,B.*
from (
select e.Id,e.code,e.Fname,
(select ComboValue from dbo.comvals where Id = c.BUDHOL) as [BUDHOL],
(select ComboValue from dbo.comvals where Id = c.COMPANY) as [COMPANY],
(select ComboValue from dbo.comvals where Id = c.BENEFICIARY) as [BENEFICIARY],
(select ComboValue from dbo.comvals where Id = c.SPARE2) as [SPARE2],
(select ComboValue from dbo.comvals where Id = c.SPARE1) as [SPARE1],
(select ComboValue from dbo.comvals where Id = c.EXPORG) as [EXPORG],
(select ComboValue from dbo.comvals where Id = c.EXPTYPE) as [EXPTYPE],
(select ComboValue from dbo.comvals where Id = c.OBJECTIVE) as [OBJECTIVE],
(select ComboValue from dbo.comvals where Id = c.TASKNO) as [TASKNO],
(select ComboValue from dbo.comvals where Id = c.PROJECTNO) as [PROJECTNO]
from dbo.EmployeeDetail e
left join (
select *
from (
select CustomeFieldName,FieldValue,CompanyId,EmployeeId
from dbo.CustomeFieldDetail
where CustomeFieldName in ('BENEFICIARY','BUDHOL','COMPANY', 'EXPORG','EXPTYPE','OBJECTIVE','PROJECTNO','SPARE2','SPARE1','TASKNO','COMPANY') and CompanyId = 1
)as src
pivot (max(FieldValue) for CustomeFieldName in ([BENEFICIARY],[BUDHOL],[EXPORG],[EXPTYPE],[OBJECTIVE],[PROJECTNO],[SPARE2],[SPARE1],[TASKNO],[COMPANY])
) as src2
) c on e.Id = c.EmployeeId and e.CompanyId = c.CompanyId and e.DateOfJoining <= convert(datetime,'30/03/2016',103) and e.CompanyId = 1
where e.Companyid=1 --order by e.Code
) A
Full Outer join (
select
T.EmployeeId,
X.[FieldName],
X.[Value]
from dbo.EmpTransaction T
cross apply (
SELECT
T.c.value('(@Name)[1]', 'Varchar(max)') AS [FieldName],
convert(float,T.c.value('(@Value)[1]', 'Varchar(max)')) AS [Value]
FROM TransactionFieldDetails.nodes('//PayDetails/Column') T(c)
where CompanyId = 1 and ProcessDate = convert(datetime,'01/03/2016',103) and CategoryId in (1)
and T.c.value('(@Name)[1]', 'Varchar(max)') in('FB')
) X
) B
ON A.id= B.EmployeeId
) As x
Schluss GroupBy Bedingung auf Temp-Tabelle
SELECT B.BENEFICIARY,
B.BUDHOL,
B.COMPANY,
B.FIELDNAME,
B.OBJECTIVE,
B.SPARE1,
B.SPARE2,
B.PROJECTNO,
B.TASKNO,
B.EXPORG,
B.EXPTYPE,
SUM(B.value)
FROM (
SELECT DISTINCT A.BENEFICIARY,
A.BUDHOL,
A.COMPANY,
A.FIELDNAME,
A.OBJECTIVE,
A.value,
A.SPARE2,
A.SPARE1,
A.PROJECTNO,
A.TASKNO,
A.EXPORG,
A.EXPTYPE
FROM (
SELECT t.BENEFICIARY,
t.BUDHOL,
t.COMPANY,
t.FIELDNAME,
t.OBJECTIVE,
t.SPARE1,
t.SPARE2,
t.PROJECTNO,
t.TASKNO,
t.EXPORG,
t.EXPTYPE,
t.value value
FROM #temp T, #temp TT
) A
LEFT JOIN #temp T1 ON A.BENEFICIARY = t1.BENEFICIARY
AND A.BUDHOL = t1.BUDHOL
AND A.COMPANY = t1.COMPANY
AND A.OBJECTIVE = t1.OBJECTIVE
AND A.SPARE1 = t1.SPARE1
AND A.SPARE2 = t1.SPARE2
AND A.PROJECTNO = t1.PROJECTNO
AND A.TASKNO = t1.TASKNO
AND A.EXPORG = t1.EXPORG
AND A.EXPTYPE = t1.EXPTYPE
) B
GROUP BY B.BENEFICIARY,
B.BUDHOL,
B.COMPANY,
B.OBJECTIVE,
B.FIELDNAME,
B.SPARE1,
B.SPARE2,
B.PROJECTNO,
B.TASKNO,
B.EXPORG,
B.EXPTYPE
Above zu erhalten Abfrage funktioniert gut und wie erwartet. müssen wissen, ob obige Abfrage optimiert werden kann, so dass ich weniger Zeit zur Zeit ausführen dauern kann es mehr als 2 min dauern auch ausführen, können wir kombinieren beide Abfragen, dh i #temp Tabelle
verwenden möchten nicht
Bitte geben Sie Ihren Ausführungsplan (sqlplan Format) – Devart
Warum dieses Kreuz verbinden tun? : von #temp T, # temp TT – vercelli
@vercelli cross join, um alle möglichen Kombinationen von Spalten und Summe von Wert zu nehmen – Nilesh