Result Select Very Slow in stored procedure - sql-server

I'm trying to optimize this query, which when run in a procedure passing parameters (datetime or date) in the where, is very slow. However, when I execute the query outside the procedure, it returns the data quickly.
Could you give me a hand?
WITH PRINCIPAL AS
(
SELECT
C.Empcod, C.MovEstqChv,
SUM(NF.NFPESOLIQ) AS PESOLIQ
FROM
MOV_ESTQ_DOC_COMPLEM C WITH (NOLOCK)
INNER JOIN
MOV_ESTQ M WITH (NOLOCK) ON C.EmpCod = M.EmpCod
AND C.MovEstqDocComplemChv = M.MOVESTQCHV
INNER JOIN
NOTA_FISCAL NF WITH (NOLOCK) ON NF.EMPCOD = C.EMPCOD
AND NF.CTRLDFMODFORM = C.MovEstqDocComplemEspec
AND NF.CtrlDFSerie = C.MovEstqDocComplemSerie
AND NF.NFNum = MovEstqDocComplemNum
WHERE
CONVERT(DATE, M.MovEstqDataEmissao) >= CONVERT(DATE, DATEADD(MM, DATEDIFF(MM, 0, #dtEmissao) + 0, 0))
AND CONVERT(DATE, M.MovEstqDataEmissao) <= CONVERT(DATE,DATEADD(D, -DAY(#dtEmissao), DATEADD(M, 1, #dtEmissao)))
AND NF.NFNatOpProd = '5.905'
GROUP BY
RIGHT(CONVERT(VARCHAR(8), M.MovEstqDataEmissao, 3),5),
C.MovEstqChv, C.EmpCod
),
SECUNDARIO AS
(
SELECT
C.Empcod, C.MovEstqChv,
CTRC.MovEstqValDoc / SUM(nfpesoliq) VALOR_FRETE_PESO
FROM
MOV_ESTQ_DOC_COMPLEM C WITH(NOLOCK)
INNER JOIN
MOV_ESTQ M WITH(NOLOCK) ON M.EMPCOD = C.EMPCOD
AND M.MOVESTQCHV = MovEstqDocComplemChv
INNER JOIN
MOV_ESTQ M2 WITH(NOLOCK) ON M2.MovEstqDocEmpCod = C.EMPCOD
AND M2.MovEstqDocEspec = MovEstqDocComplemEspec
AND M2.MovEstqDocSerie = MovEstqDocComplemSerie
AND RIGHT(M2.MovEstqDocNum, 6) = RIGHT(MovEstqDocComplemNum, 6)
AND M2.MOVESTQCHV = C.MovEstqDocComplemChv
LEFT JOIN
NOTA_FISCAL N WITH(NOLOCK) ON M2.MovEstqDocEmpCod = N.EMPCOD
AND M2.MovEstqDocEspec = N.CtrlDFModForm
AND M2.MovEstqDocSerie = N.CtrlDFSerie
AND M2.MovEstqDocNum = N.NFNUM
INNER JOIN
MOV_ESTQ CTRC WITH(NOLOCK) ON CTRC.EMPCOD = C.EMPCOD
AND CTRC.MOVESTQCHV = C.MOVESTQCHV
WHERE
N.NFPesoLiq > 0
AND CONVERT(DATE, CTRC.MovEstqDataEmissao) >= CONVERT(DATE, DATEADD(MM, DATEDIFF(MM, 0, #dtEmissao) + 0, 0))
AND CONVERT(DATE, CTRC.MovEstqDataEmissao) <= CONVERT(DATE, DATEADD(D, -DAY(#dtEmissao), DATEADD(M, 1, #dtEmissao)))
GROUP BY
CTRC.MovEstqValDoc, C.MovEstqChv, C.Empcod
)
SELECT
#vlFreteTransferencia = SUM(SECUNDARIO.VALOR_FRETE_PESO * PRINCIPAL.PESOLIQ) / SUM(PRINCIPAL.PESOLIQ)
FROM
PRINCIPAL WITH(NOLOCK)
INNER JOIN
SECUNDARIO WITH(NOLOCK) ON PRINCIPAL.MOVESTQCHV = SECUNDARIO.MovEstqChv
AND PRINCIPAL.EmpCod = SECUNDARIO.EmpCod
Grateful.

Related

SQL select unique column with maximum for 2nd column

Please how to combine maximum and distinct to have always unique Id and maximum of the column for that unique Id?
For example, if I have,
OrdinaceId Priloha2Id
5 1
5 2
6 2
6 4
7 1
result will be
OrdinaceId Priloha2Id
5 2
6 4
7 1
how to return only 1 row(with the same Id) with a maximum of Priloha2Id?
select * from (select
distinct ord.Id as OrdinaceId,
ord.CleneniPzsId,
posk.Id,
posk.ICO as Ico,
zar.ICZ as Icz,
posk.NazevZkraceny as Zkratka,
case when cle.Primariat = 0 then cle.Icp end as Icp,
IIF(cle.Primariat = 1, pri.OborKod , cle.OdbornostKod) as OdbornostKod,
ord.Nazev as OrdinaceNazev,
(select Street + N' ' + DescriptiveNo + N', ' + PostCode + N' ' + City from ICIS_Repl.repl.Address where Code = ord.NavAddressCode and Type = N'ORDINACE' and (ValidFrom is null or ValidFrom <= GETDATE()) and (ValidTill is null or ValidTill >= GETDATE() or ValidTill = N'1753-01-01 00:00:00')) as OrdinaceAdresaCela,
pril.Id as Priloha2Id,
cle.Smluvni,
cisP2KomunikaceStav.Nazev as EP2,
cisPzs.Nazev as StavPzp,
pril.Status,
pril.Info,
pril.PriPlatnostOd as PlatnostOd,
pril.PriPlatnostDo as PlatnostDo
from Ordinace ord
left join CleneniPzs cle on cle.Id = ord.CleneniPzsId
left join ZarizeniPZS zar on cle.ZarizeniPzsId = zar.Id
left join PoskytovatelZS posk on zar.PoskytovatelZsId = posk.Id
left join Primariat pri on cle.PrimariatId = pri.Id
left join Pril2Formular pr on pr.CleneniPzsId = cle.Id
left join Priloha2 pril on pril.Id = pr.Priloha2Id and (pril.PriPlatnostOd <= GETDATE() or pril.PriPlatnostOd is null) and (pril.PriPlatnostDo is null or pril.PriPlatnostDo >= GETDATE())
join CisCiselnik cisP2KomunikaceStav on posk.P2KomunikaceStavKod = cisP2KomunikaceStav.Kod AND cisP2KomunikaceStav.Oblast = N'P2KomunikaceStav' and cisP2KomunikaceStav.PlatnostOd <= GETDATE() and (cisP2KomunikaceStav.PlatnostDo is null or cisP2KomunikaceStav.PlatnostDo >= GETDATE())
left join P2Formular form on form.Icp = cle.Icp and form.Aktivni = 1
left join CisCiselnik cisPzs on form.P2StavPzpKod = cisPzs.Kod AND cisPzs.Oblast = N'P2StavPZP' and cisPzs.PlatnostOd <= GETDATE() and (cisPzs.PlatnostDo is null or cisPzs.PlatnostDo >= GETDATE())
left join P2ZarizeniPZS z on form.P2ZarizeniPzsId = z.Id and z.Icz = zar.ICZ and z.PoskytovatelZsId = posk.Id
join Smlouva smlv on smlv.Id = pril.SmlouvaId
left join SmluvniVykon smlVyk on smlVyk.CleneniPzsId = cle.Id and smlVyk.PlatnostOd <= GETDATE() and (smlVyk.PlatnostDo is null or smlVyk.PlatnostDo >= GETDATE())
left join SmlVykonVyjadreniRL vyjadreni on vyjadreni.Id = smlVyk.VyjadreniRLId ) a
You may use CTE to get max(Priloha2Id) per id. Then join to it.
Something like:
;with Pril2Formular_max_per_id as (
select ord.Id as OrdinaceId, max(pr.Priloha2Id) as max_Priloha2Id
from Ordinace ord
left join CleneniPzs cle on cle.Id = ord.CleneniPzsId
left join Pril2Formular pr on pr.CleneniPzsId = cle.Id
group by ord.Id
)
select * from (select
distinct ord.Id as OrdinaceId,[![enter image description here][1]][1]
ord.CleneniPzsId,
posk.Id,
posk.ICO as Ico,
zar.ICZ as Icz,
posk.NazevZkraceny as Zkratka,
case when cle.Primariat = 0 then cle.Icp end as Icp,
IIF(cle.Primariat = 1, pri.OborKod , cle.OdbornostKod) as OdbornostKod,
ord.Nazev as OrdinaceNazev,
(select Street + N' ' + DescriptiveNo + N', ' + PostCode + N' ' + City from ICIS_Repl.repl.Address where Code = ord.NavAddressCode and Type = N'ORDINACE' and (ValidFrom is null or ValidFrom <= GETDATE()) and (ValidTill is null or ValidTill >= GETDATE() or ValidTill = N'1753-01-01 00:00:00')) as OrdinaceAdresaCela,
pril.Id as Priloha2Id,
cle.Smluvni,
cisP2KomunikaceStav.Nazev as EP2,
cisPzs.Nazev as StavPzp,
pril.Status,
pril.Info,
pril.PriPlatnostOd as PlatnostOd,
pril.PriPlatnostDo as PlatnostDo
from Ordinace ord
left join CleneniPzs cle on cle.Id = ord.CleneniPzsId
left join ZarizeniPZS zar on cle.ZarizeniPzsId = zar.Id
left join PoskytovatelZS posk on zar.PoskytovatelZsId = posk.Id
left join Primariat pri on cle.PrimariatId = pri.Id
left join Pril2Formular_max_per_id pr on pr.OrdinaceId = ord.Id
left join Priloha2 pril on pril.Id = pr.max_Priloha2Id and (pril.PriPlatnostOd <= GETDATE() or pril.PriPlatnostOd is null) and (pril.PriPlatnostDo is null or pril.PriPlatnostDo >= GETDATE())
join CisCiselnik cisP2KomunikaceStav on posk.P2KomunikaceStavKod = cisP2KomunikaceStav.Kod AND cisP2KomunikaceStav.Oblast = N'P2KomunikaceStav' and cisP2KomunikaceStav.PlatnostOd <= GETDATE() and (cisP2KomunikaceStav.PlatnostDo is null or cisP2KomunikaceStav.PlatnostDo >= GETDATE())
left join P2Formular form on form.Icp = cle.Icp and form.Aktivni = 1
left join CisCiselnik cisPzs on form.P2StavPzpKod = cisPzs.Kod AND cisPzs.Oblast = N'P2StavPZP' and cisPzs.PlatnostOd <= GETDATE() and (cisPzs.PlatnostDo is null or cisPzs.PlatnostDo >= GETDATE())
left join P2ZarizeniPZS z on form.P2ZarizeniPzsId = z.Id and z.Icz = zar.ICZ and z.PoskytovatelZsId = posk.Id
join Smlouva smlv on smlv.Id = pril.SmlouvaId
left join SmluvniVykon smlVyk on smlVyk.CleneniPzsId = cle.Id and smlVyk.PlatnostOd <= GETDATE() and (smlVyk.PlatnostDo is null or smlVyk.PlatnostDo >= GETDATE())
left join SmlVykonVyjadreniRL vyjadreni on vyjadreni.Id = smlVyk.VyjadreniRLId ) a ;
select Id, max(Priloha2Id) from table group by Id

SQL INSERT statements

The first piece of code represents a update statement that updates all existing columns rows to whatever the user wants. So then i wrote a select statement that grabbed all the columns that were null/not existing and it returns 63 rows without the end where statement but with it then returns 62 which are the ones that are NULL not existing. So now I need to convert the sql select that selects all NUll rows into a insert than puts data into those not existing records. so far I posted what i have. Why isn't this working? it is saying that column schoolDay does not exist, how do i input those fields?
update e
set e.type = #dayEvent
from odb.dayEvent e
inner join odb.day d on e.dayID = d.dayID
inner join MMSD.vSchoolFromCalendar c on d.calendarID = c.calendarID
and d.structureID = c.structureID
inner join odb.PeriodSchedule p on d.periodScheduleID = p.periodScheduleID
and d.structureID = p.structureID
where d.[date] between #toDate and #fromDate
and datepart(dw, d.[date]) not in (1,7)
and e.[type] != #dayEvent
and DistrictCode = 'MA'
and FiscalYear = #FiscalYear
and summerSchool = '0'
and left(SchoolCode, 1) = #schoolChoice
and e.[type] != #dayEvent
select
sts = 'success',
result = convert(varchar, ##rowcount) + ' rows updated.';
set #rowcount = (select ##rowcount);
select
d.schoolDay,
d.instruction,
d.attendance,
d.duration,
d.comments,
d.startTime, d.endTime,
e.type
from
odb.dayEvent e
right outer join
odb.day d on e.dayID = d.dayID
inner join
MMSD.vSchoolFromCalendar c on d.calendarID = c.calendarID
and d.structureID = c.structureID
inner join
odb.PeriodSchedule p on d.periodScheduleID = p.periodScheduleID
and d.structureID = p.structureID
where
d.[date] between '2019-02-12' and '2019-02-12'
and datepart(dw, d.[date]) not in (1, 7)
and DistrictCode = 'MA'
and FiscalYear = '2019'
and summerSchool = '0'
and left(SchoolCode, 1) = '0'
and e.dayEventID IS NULL
Code so far
INSERT INTO odb.dayEvent (schoolDay, instruction, attendance, duration, comments, startTime, endTime)
SELECT
d.schoolDay, d.instruction, d.attendance, d.duration, d.comments,
d.startTime, d.endTime
FROM
odb.dayEvent e
RIGHT OUTER JOIN
odb.day d ON e.dayID = d.dayID
INNER JOIN
MMSD.vSchoolFromCalendar c ON d.calendarID = c.calendarID
AND d.structureID = c.structureID
INNER JOIN
odb.PeriodSchedule p ON d.periodScheduleID = p.periodScheduleID
AND d.structureID = p.structureID
WHERE
d.[date] BETWEEN '2019-02-12' AND '2019-02-12'
AND DATEPART(dw, d.[date]) NOT IN (1, 7)
AND DistrictCode = 'MA'
AND FiscalYear = '2019'
AND summerSchool = '0'
AND LEFT(SchoolCode, 1) = '0'
AND e.dayEventID IS NULL
This is my answer for now, looks like another peace of my code was already solving my questioning issue.....
insert into odb.DayEvent
(dayID, type, duration, instructionalMinutes)
select
e.dayID, e.type, e.duration, e.instructionalMinutes
from odb.dayEvent e
RIGHT OUTER JOIN odb.day d ON e.dayID = d.dayID
INNER JOIN MMSD.vSchoolFromCalendar c ON d.calendarID = c.calendarID
and d.structureID = c.structureID
INNER JOIN odb.PeriodSchedule p ON d.periodScheduleID = p.periodScheduleID
and d.structureID = p.structureID
WHERE d.[date] between '2019-02-12' and '2019-02-12'
and datepart(dw,d.[date]) not in (1,7)
and DistrictCode = 'MA'
and FiscalYear = '2019'
and summerSchool = '0'
and left(SchoolCode,1) = '0'
and e.type IS NULL
select sts='success', result= convert( varchar,##rowcount) + ' rows updated.';
set #rowcount = (select ##rowcount);

SQL Server 2014 - Multiple SUM/COUNT with subqueries

I have a two part question.
First part is about the speed of what I am doing below. I am taking a data set and getting each DISTINCT, then joining a subquery that sums/counts with criteria, then repeating that five times. After the first LEFT JOIN I have a run time of 02 seconds, after the second LEFT JOIN I have a run time of 04 seconds, but on the third LEFT JOIN my run time goes to 44 seconds. If that pull that query aside and run it alone, it is just 01 second. The total run time for the finished query is 70 seconds.
First part question:
What is making this query dramatically slower at the third join?
Second part: I am sure that I am accomplishing this in an inefficient way. I looked around for a while and was unable to find a way to accomplish what I am doing in a simple way while still being able to have different criteria for each subquery.
Second part question:
Is there a better way of accomplishing this query?
Edit after user1413's comment.
SELECT DISTINCT at the beginning was showing 49% cost in SQL Server execution plan view. I changed the table that the SELECT DISTINCT was selecting from and my run time went down to below 01 second.
SELECT DISTINCT
od.location, currentTires, currentAlignments, currentLubes,
currentBatteries,currentSiping,currentCarcount
FROM
comm.dbo.ordetail as od
LEFT JOIN
(SELECT
od2.location, SUM(od2.qty_shipped) as currentTires
FROM
comm.dbo.ordetail as od2
JOIN
comm.dbo.invmas as invmas2 ON invmas2.item_num = od2.item#
JOIN
comm.dbo.ordhrd as oh2 ON oh2.location = od2.location
AND oh2.inv_date = od2.inv_date
AND oh2.invoice# = od2.invoice#
WHERE
(oh2.type_of_rec = '01' OR oh2.type_of_rec = '02')
AND od2.inv_date >= '2017-02-01 00:00:00.000'
AND od2.inv_date <= '2017-02-28 00:00:00.000'
AND ( invmas2.category = 'uhp' OR invmas2.category = 'tour' OR invmas2.category = 'mass' OR invmas2.category = 'suv' OR invmas2.category = 'ltat' OR invmas2.category = 'ltmt' OR invmas2.category = 'lthwy' OR invmas2.category = 'snow' OR invmas2.category = 'stdls' )
GROUP BY
od2.location) as currentTires ON od.location = currentTires.location
LEFT JOIN
(SELECT
od3.location, SUM(od3.qty_shipped) as currentAlignments
FROM
comm.dbo.ordetail as od3
JOIN
comm.dbo.invmas as invmas3 ON invmas3.item_num = od3.item#
JOIN
comm.dbo.ordhrd as oh3 ON oh3.location = od3.location
AND oh3.inv_date = od3.inv_date
AND oh3.invoice# = od3.invoice#
WHERE
(oh3.type_of_rec = '01' OR oh3.type_of_rec = '02')
AND od3.inv_date >= '2017-02-01 00:00:00.000'
AND od3.inv_date <= '2017-02-28 00:00:00.000'
AND (od3.item# = '8501' OR od3.item# = '8502')
GROUP BY
od3.location) as currentAlignments ON od.location = currentAlignments.location
LEFT JOIN
(SELECT
od4.location, SUM(od4.qty_shipped) as currentLubes
FROM
comm.dbo.ordetail as od4
JOIN
comm.dbo.invmas as invmas4 ON invmas4.item_num = od4.item#
JOIN
comm.dbo.ordhrd as oh4 ON oh4.location = od4.location
AND oh4.inv_date = od4.inv_date
AND oh4.invoice# = od4.invoice#
WHERE
(oh4.type_of_rec = '01' OR oh4.type_of_rec = '02')
AND od4.inv_date >= '2017-02-01 00:00:00.000'
AND od4.inv_date <= '2017-02-28 00:00:00.000'
AND (od4.item# = '200fs' OR od4.item# = '200c' OR od4.item# = '200m' OR od4.item# = '200s')
GROUP BY
od4.location) as currentLubes ON od.location = currentLubes.location
LEFT JOIN ( SELECT od5.location,SUM(od5.qty_shipped) as currentBatteries
FROM comm.dbo.ordetail as od5
JOIN comm.dbo.invmas as invmas5
ON invmas5.item_num = od5.item#
JOIN comm.dbo.ordhrd as oh5
ON oh5.location = od5.location
AND oh5.inv_date = od5.inv_date
AND oh5.invoice# = od5.invoice#
WHERE ( oh5.type_of_rec = '01' OR oh5.type_of_rec = '02' )
AND od5.inv_date >= '2017-02-01 00:00:00.000'
AND od5.inv_date <= '2017-02-28 00:00:00.000'
AND invmas5.manufact = 'inter'
GROUP BY od5.location) as currentBatteries
ON od.location = currentBatteries.location
LEFT JOIN ( SELECT od6.location,SUM(od6.qty_shipped) as currentSiping
FROM comm.dbo.ordetail as od6
JOIN comm.dbo.invmas as invmas6
ON invmas6.item_num = od6.item#
JOIN comm.dbo.ordhrd as oh6
ON oh6.location = od6.location
AND oh6.inv_date = od6.inv_date
AND oh6.invoice# = od6.invoice#
WHERE ( oh6.type_of_rec = '01' OR oh6.type_of_rec = '02' )
AND od6.inv_date >= '2017-02-01 00:00:00.000'
AND od6.inv_date <= '2017-02-28 00:00:00.000'
AND invmas6.manufact = 'inter'
GROUP BY od6.location) as currentSiping
ON od.location = currentSiping.location
LEFT JOIN ( SELECT od7.location,COUNT(DISTINCT oh7.invoice#) as currentCarcount
FROM comm.dbo.ordetail as od7
JOIN comm.dbo.ordhrd as oh7
ON oh7.location = od7.location
AND oh7.inv_date = od7.inv_date
AND oh7.invoice# = od7.invoice#
WHERE ( oh7.type_of_rec = '01' OR oh7.type_of_rec = '02' )
AND od7.inv_date >= '2017-02-01 00:00:00.000'
AND od7.inv_date <= '2017-02-28 00:00:00.000'
AND oh7.veh_make != ''
AND od7.item# != ''
GROUP BY od7.location) as currentCarcount
ON od.location = currentCarcount.location
ORDER BY od.location
Sample data output:
There are a lot of things that could be made better here. For starters, one of the following joins below could be eliminated as the same items are returned for both od5 and od6.
LEFT JOIN ( SELECT od5.location,SUM(od5.qty_shipped) as currentBatteries
FROM comm.dbo.ordetail as od5
JOIN comm.dbo.invmas as invmas5
ON invmas5.item_num = od5.item#
JOIN comm.dbo.ordhrd as oh5
ON oh5.location = od5.location
AND oh5.inv_date = od5.inv_date
AND oh5.invoice# = od5.invoice#
WHERE ( oh5.type_of_rec = '01' OR oh5.type_of_rec = '02' )
AND od5.inv_date >= '2017-02-01 00:00:00.000'
AND od5.inv_date <= '2017-02-28 00:00:00.000'
AND invmas5.manufact = 'inter'
GROUP BY od5.location) as currentBatteries
ON od.location = currentBatteries.location
LEFT JOIN ( SELECT od6.location,SUM(od6.qty_shipped) as currentSiping
FROM comm.dbo.ordetail as od6
JOIN comm.dbo.invmas as invmas6
ON invmas6.item_num = od6.item#
JOIN comm.dbo.ordhrd as oh6
ON oh6.location = od6.location
AND oh6.inv_date = od6.inv_date
AND oh6.invoice# = od6.invoice#
WHERE ( oh6.type_of_rec = '01' OR oh6.type_of_rec = '02' )
AND od6.inv_date >= '2017-02-01 00:00:00.000'
AND od6.inv_date <= '2017-02-28 00:00:00.000'
AND invmas6.manufact = 'inter'
GROUP BY od6.location) as currentSiping
ON od.location = currentSiping.location
As for performance and readability try something like below. NOTE : I can not possibly test this, however, it may give insight to someone with more time to fiddle with performance tuning your query.
DECLARE #LowDate DATETIME = '2017-02-01 00:00:00.000'
DECLARE #HighDate DATETIME = '2017-02-28 00:00:00.000'
SELECT
DetailList.location,
currentTires = SUM(currentTires),
currentAlignments = SUM(currentAlignments),
currentLubes = SUM(currentLubes),
currentBatteries = SUM(currentBatteries),
currentSiping = SUM(currentSiping),
carCount = SUM(hasCar)
FROM
(
SELECT
od.location,
currentLubes=CASE WHEN ( od.item# = '200fs' OR od.item# = '200c' OR od.item# = '200m' OR od.item# = '200s' ) THEN od.qty_shipped ELSE NULL END,
currentAlignments=CASE WHEN ( od.item# = '8501' OR od.item# = '8502' ) THEN od.qty_shipped ELSE NULL END,
currentSiping = CASE WHEN ( invmas.item_num = 'p15' OR invmas.item_num = 'u15' ) THEN od.qty_shipped ELSE NULL END,
currentBatteries = CASE WHEN invmas.manufact = 'inter' THEN od.qty_shipped ELSE NULL END,
currentTires= CASE WHEN ( invmas.category = 'uhp' OR invmas.category = 'tour' OR invmas.category = 'mass' OR invmas.category = 'suv' OR invmas.category = 'ltat' OR
invmas.category = 'ltmt' OR invmas.category = 'lthwy' OR invmas.category = 'snow' OR invmas.category = 'stdls' ) THEN od.qty_shipped ELSE NULL END,
hasCar= CASE WHEN (oh.veh_make != '' AND od.item# !='') THEN 1 ELSE 0 END
FROM
comm.dbo.ordetail as od
LEFT JOIN comm.dbo.invmas as invmas ON invmas.item_num = od.item# --FOR currentCarcount
INNER JOIN comm.dbo.ordhrd as oh ON oh.location = od.location AND oh.inv_date = od.inv_date AND oh.invoice# = od.invoice#
WHERE
od.inv_date BETWEEN '2017-02-01 00:00:00.000' AND '2017-02-28 00:00:00.000'
AND
oh.type_of_rec IN('01','02')
)AS DetailList
GROUP BY
DetailList.location

sql - looking for next day data

i have the below code which is working fine.
SELECT
pg.pgrpName1 [Santiye],
p.prsncode [Sicil No],
p.[prsnname1] [Adi],
p.[prsnname2] [Soyadi],
CLT.clntName1 [Firmasi],
fg3.grp3Name1 [Gorevi],
prf.pcntrName1 [Ekibi],
lnk11.lgrp11Name1 [Kaldigi Yer],
lnk12.lgrp12Name1 +' - '+lnk12.lgrp12Name2 [Kamp/Adres],
lnk13.lgrp13Name1 [Oda No],
cast(t.ioTransactionDate as date) as Tarih,
t.[iotransactiondate] [Giris Tarihi/Saati],
(SELECT
t2.[iotransactiondate]
FROM [Exen].[dbo].[IOTransaction] t2
WHERE ( t2.[iotransactiondate] = (SELECT Min(m.[ioTransactionDate])
FROM IOTransaction m
WHERE m.ioPrsnRefId = t2.ioPrsnRefId
AND Cast(m.[iotransactiondate] AS DATE)
= Cast
(
t2.[iotransactiondate] AS DATE)
GROUP BY m.ioPrsnRefId)
OR t2.[iotransactiondate] = (SELECT Max(m.[iotransactiondate])
FROM IOTransaction m
WHERE m.ioPrsnRefId = t2.ioPrsnRefId
AND Cast(m.[iotransactiondate] AS
DATE) =
Cast(
t2.[iotransactiondate] AS DATE)
GROUP BY m.ioPrsnRefId) )
and ioStatus = 1
and cast(t2.ioTransactionDate as date) = cast(t.ioTransactionDate as date)
and t.ioPrsnRefId = t2.ioPrsnRefId
GROUP BY
t2.[iotransactiondate]
)
AS [Cikis Tarihi/Saati],
prsnEText4 [Vardiya],
tz.tzoneName1 [GECE/GUNDUZ]
FROM [Exen].[dbo].[IOTransaction] t
LEFT JOIN dbo.person p
ON t.ioPrsnRefId = p.prsnRefId
LEFT JOIN dbo.PersonShift ps
ON ps.psPrsnRefId = p.prsnRefId
LEFT JOIN dbo.TimeZoneMess tz
ON tz.tzoneRefId = ps.psTzoneRefId
LEFT JOIN dbo.[PersonGroup] pg
ON pg.pgrpRefId = p.prsnPgrpRefId
LEFT JOIN FreeGroup3 fg3
ON fg3.grp3RefId = p.prsnGrp3RefId
left join Client CLT
ON CLT.clntRefId = P.prsnClntRefId
LEFT JOIN [ProfitCenter] prf
ON prf.pcntrRefId = p.prsnPcntrRefId
LEFT JOIN LinkedGroup11 lnk11
ON lnk11.lgrp11RefId = p.prsnLgrp11RefId
LEFT JOIN LinkedGroup12 lnk12
ON lnk12.lgrp12RefId = p.prsnLgrp12RefId
LEFT JOIN LinkedGroup13 lnk13
ON lnk13.lgrp13RefId = p.prsnLgrp13RefId
WHERE ( t.[iotransactiondate] = (SELECT Min(m.[ioTransactionDate])
FROM IOTransaction m
WHERE m.ioPrsnRefId = t.ioPrsnRefId
AND Cast(m.[iotransactiondate] AS DATE)
= Cast
(
t.[iotransactiondate] AS DATE)
GROUP BY m.ioPrsnRefId)
OR t.[iotransactiondate] = (SELECT Max(m.[iotransactiondate])
FROM IOTransaction m
WHERE m.ioPrsnRefId = t.ioPrsnRefId
AND Cast(m.[iotransactiondate] AS
DATE) =
Cast(
t.[iotransactiondate] AS DATE)
GROUP BY m.ioPrsnRefId) )
AND p.[prsnname1] IS NOT NULL
AND t.iotransactiondate >= '00:00:00 11.12.2016'
AND t.iotransactiondate <= '23:59:00 15.12.2016'
AND ps.psStartDate <= t.[iotransactiondate]
AND ps.psFinishDate > t.[iotransactiondate]
AND tz.tzoneRefId =5
and ioStatus = 0
GROUP BY pg.pgrpName1 ,
t.ioPrsnRefId,
prsncode,
prsnname1,
prsnname2,
t.[iotransactiondate],
t.iostatus,
tz.tzoneName1,
ps.psStartDate,
ps.psFinishDate,
prsnEText4,
fg3.grp3Name1,
CLT.clntName1,
prf.pcntrName1,
lgrp11Name1,
lgrp12Name1,
lgrp12Name2,
lgrp13Name1
but i need the next day data for [Cikis Tarihi/Saati] column , that's why i revised that part as
and cast(t2.ioTransactionDate as date) = cast(dateadd(day,1,t.ioTransactionDate) as date)
for example, when the column [Giris Tarihi/Saati] is 2016-12-12 , the data on the column [Cikis Tarihi/Saati] should be 2016-12-13
but it returns an error
Msg 512, Level 16, State 1, Line 1 Subquery returned more than 1
value. This is not permitted when the subquery follows =, !=, <, <= ,
, >= or when the subquery is used as an expression.
what am i doing wrong ?
any suggestions ?

SQL Server stored procedure - A severe error occurred in the current command

I'm having an unusual error with a stored procedure I've wrote to generate telephony statistics. I'm running this sproc on a SQL Server 2005 clustered environment. The procedure gets called around 40 times sequentially (once per call queue) to populate a temp table and then insert this temp table into a table which stores one line per day per queue.
I understand that there is a hotfix to apply to the sql boxes however I wanted to check if there was anything wrong with my sproc before getting the network lads to install patches etc
The main sproc can be seen below (its a lengthy code nightmare). It uses 5 views which are connected to the main telephony database via a linked server (its a Cisco UCCX telephony system).
The error I'm experiencing is as follows:
ERROR MESSAGE
Msg 0, Level 11, State 0, Line 0
A severe error occurred in the current command. The results, if any,
should be discarded
Msg 0, Level 20, Stata 0, Line 0
A severe error occurred in the current command. The results, if any,
should be discarded
PROCEDURE WHICH CALLS THE MAIN STORED PROCEDURE
-- North
EXEC [dbo].[SP_GetStatsMain_ByCSQName] #starttime = #OfficeOpen, #endtime = #OfficeClose, #queue = N'CSQ-N003A', #date = #runDate
EXEC [dbo].[SP_GetStatsMain_ByCSQName] #starttime = #OfficeOpen, #endtime = #OfficeClose, #queue = N'CSQ-N004A', #date = #runDate
EXEC [dbo].[SP_GetStatsMain_ByCSQName] #starttime = #OfficeOpen, #endtime = #OfficeClose, #queue = N'CSQ-N005A', #date = #runDate
MAIN STORED PROCEDURE
ALTER PROCEDURE [dbo].[SP_GetStatsMain_ByCSQName]
-- Add the parameters for the stored procedure here
#starttime DATETIME,
#endtime DATETIME,
#queue varchar(50),
#date DATETIME
AS
BEGIN
SET NOCOUNT ON;
DECLARE #start DATETIME, #end DATETIME/*, #date DATETIME
set #date = getdate()-1*/
set #start = DATEADD(ms, DATEDIFF(ms, 0, #starttime), DATEADD(dd, 0, DATEDIFF(dd, 0, #date)))
set #end = DATEADD(ms, DATEDIFF(ms, 0, #endtime), DATEADD(dd, 0, DATEDIFF(dd, 0, #date)))
IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp
CREATE TABLE #Temp(
[CSQName] [varchar](50) NULL,
[Presented] [int] NULL,
[Handled] [int] NULL,
[Abandonded] [int] NULL,
[Dequeued] [int] NULL,
[HandledSLA] [float] NULL,
[AbandondedSLA] [float] NULL,
[AvgTalkTime] [float] NULL,
[AvgWaitTime] [float] NULL,
[Date] [datetime] NULL
) ON [PRIMARY]
insert into #Temp([CSQName])
SELECT DISTINCT CSQ.CSQName
FROM CSQ INNER JOIN Queues ON CSQ.CSQName = Queues.CSQName
WHERE ((dateInactive IS NULL)
OR (dateInactive < GETDATE() - 1)) AND Queues.csqname = #queue
UPDATE #temp
SET [Date] = dateadd(dd,0, datediff(dd,0,#Date))
UPDATE #temp
SET [Presented] = 0,
[Handled] = 0,
[Abandonded] = 0,
[Dequeued] = 0,
[HandledSLA] = 0,
[AbandondedSLA] = 0,
[AvgTalkTime] = 0,
[AvgWaitTime] = 0
UPDATE #temp
SET Handled =
(
SELECT COUNT(CQD.targetType)
FROM ACD
INNER JOIN CCD ON ACD.sessionID = CCD.sessionID AND ACD.sessionSeqNum = CCD.sessionSeqNum
AND ACD.nodeID = CCD.nodeID
AND ACD.profileID = CCD.profileID
INNER JOIN CQD ON ACD.sessionID = CQD.sessionID
AND ACD.sessionSeqNum = CQD.sessionSeqNum
AND ACD.profileID = CQD.profileID
AND ACD.nodeID = CQD.nodeID
INNER JOIN CSQ ON CQD.targetID = CSQ.recordID
AND CQD.profileID = CSQ.profileID
INNER JOIN Queues ON CSQ.CSQName = Queues.csqname
INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
WHERE
(CCD.startDateTime > CONVERT(DATETIME, #start, 102))
AND (CCD.startDateTime < CONVERT(DATETIME, #end, 102))
AND (CCD.contactDisposition = 2)
AND (ACD.talkTime > 0)
AND (CQD.targetType = 0)
AND (CQD.disposition = 2)
AND Queues.csqname = #queue
)
FROM ACD
INNER JOIN CCD ON ACD.sessionID = CCD.sessionID AND ACD.sessionSeqNum = CCD.sessionSeqNum
AND ACD.nodeID = CCD.nodeID
AND ACD.profileID = CCD.profileID
INNER JOIN CQD ON ACD.sessionID = CQD.sessionID
AND ACD.sessionSeqNum = CQD.sessionSeqNum
AND ACD.profileID = CQD.profileID
AND ACD.nodeID = CQD.nodeID
INNER JOIN CSQ ON CQD.targetID = CSQ.recordID
AND CQD.profileID = CSQ.profileID
INNER JOIN Queues ON CSQ.CSQName = Queues.csqname
INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
WHERE
(CCD.startDateTime > CONVERT(DATETIME, #start, 102))
AND (CCD.startDateTime < CONVERT(DATETIME, #end, 102))
AND (CCD.contactDisposition = 2)
AND (ACD.talkTime > 0)
AND (CQD.targetType = 0)
AND (CQD.disposition = 2)
AND Queues.csqname = #queue
UPDATE #temp
SET Presented =
(
SELECT COUNT(CQD.sessionID) AS [Calls Presented]
FROM CQD INNER JOIN
CCD ON CQD.sessionID = CCD.sessionID AND CQD.sessionSeqNum = CCD.sessionSeqNum AND CQD.profileID = CCD.profileID AND
CQD.nodeID = CCD.nodeID INNER JOIN
CSQ ON CQD.profileID = CSQ.profileID AND CQD.targetID = CSQ.recordID INNER JOIN
Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
WHERE (CCD.startDateTime > CONVERT(DATETIME, #start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, #end, 102))
AND Queues.csqname = #queue
)
FROM CQD INNER JOIN
CCD ON CQD.sessionID = CCD.sessionID AND CQD.sessionSeqNum = CCD.sessionSeqNum AND CQD.profileID = CCD.profileID AND
CQD.nodeID = CCD.nodeID INNER JOIN
CSQ ON CQD.profileID = CSQ.profileID AND CQD.targetID = CSQ.recordID INNER JOIN
Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
WHERE (CCD.startDateTime > CONVERT(DATETIME, #start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, #end, 102))
AND Queues.csqname = #queue
UPDATE #temp
SET Abandonded =
(
SELECT COUNT(CQD.sessionSeqNum) AS [Calls Abandonded]
FROM CCD INNER JOIN
CQD ON CCD.sessionID = CQD.sessionID AND CCD.sessionSeqNum = CQD.sessionSeqNum AND CCD.nodeID = CQD.nodeID AND
CCD.profileID = CQD.profileID INNER JOIN
CSQ ON CQD.profileID = CSQ.profileID AND CQD.targetID = CSQ.recordID INNER JOIN
Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
WHERE (CQD.targetType = 0) AND (CQD.disposition = 1) AND (CCD.startDateTime > CONVERT(DATETIME, #start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, #end, 102))
AND Queues.csqname = #queue
)
FROM CCD INNER JOIN
CQD ON CCD.sessionID = CQD.sessionID AND CCD.sessionSeqNum = CQD.sessionSeqNum AND CCD.nodeID = CQD.nodeID AND
CCD.profileID = CQD.profileID INNER JOIN
CSQ ON CQD.profileID = CSQ.profileID AND CQD.targetID = CSQ.recordID INNER JOIN
Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
WHERE (CQD.targetType = 0) AND (CQD.disposition = 1) AND (CCD.startDateTime > CONVERT(DATETIME, #start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, #end, 102))
AND Queues.csqname = #queue
UPDATE #temp
SET Dequeued =
(
SELECT COUNT(CQD.sessionSeqNum) AS [Calls Dequeued]
FROM CCD INNER JOIN
CQD ON CCD.sessionID = CQD.sessionID AND CCD.sessionSeqNum = CQD.sessionSeqNum AND CCD.nodeID = CQD.nodeID AND
CCD.profileID = CQD.profileID INNER JOIN
CSQ ON CQD.profileID = CSQ.profileID AND CQD.targetID = CSQ.recordID INNER JOIN
Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
WHERE (CCD.startDateTime > CONVERT(DATETIME, #start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, #end, 102))
AND (CQD.targetType = 0) AND (CQD.disposition = 3)
AND Queues.csqname = #queue
)
FROM CCD INNER JOIN
CQD ON CCD.sessionID = CQD.sessionID AND CCD.sessionSeqNum = CQD.sessionSeqNum AND CCD.nodeID = CQD.nodeID AND
CCD.profileID = CQD.profileID INNER JOIN
CSQ ON CQD.profileID = CSQ.profileID AND CQD.targetID = CSQ.recordID INNER JOIN
Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
WHERE (CCD.startDateTime > CONVERT(DATETIME, #start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, #end, 102))
AND (CQD.targetType = 0) AND (CQD.disposition = 3)
AND Queues.csqname = #queue
UPDATE #temp
SET AbandondedSLA =
(
SELECT COUNT(CQD.sessionSeqNum) AS [Calls Abandonded SLA]
FROM CCD INNER JOIN
CQD ON CCD.sessionID = CQD.sessionID AND CCD.sessionSeqNum = CQD.sessionSeqNum AND CCD.nodeID = CQD.nodeID AND
CCD.profileID = CQD.profileID INNER JOIN
CSQ ON CQD.profileID = CSQ.profileID AND CQD.targetID = CSQ.recordID INNER JOIN
Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
WHERE (CQD.targetType = 0) AND (CQD.disposition = 1) AND (CCD.startDateTime > CONVERT(DATETIME, #start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, #end, 102))
AND (CQD.metServiceLevel =1)
AND Queues.csqname = #queue
)
FROM CCD INNER JOIN
CQD ON CCD.sessionID = CQD.sessionID AND CCD.sessionSeqNum = CQD.sessionSeqNum AND CCD.nodeID = CQD.nodeID AND
CCD.profileID = CQD.profileID INNER JOIN
CSQ ON CQD.profileID = CSQ.profileID AND CQD.targetID = CSQ.recordID INNER JOIN
Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
WHERE (CQD.targetType = 0) AND (CQD.disposition = 1) AND (CCD.startDateTime > CONVERT(DATETIME, #start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, #end, 102))
AND (CQD.metServiceLevel =1)
AND Queues.csqname = #queue
UPDATE #temp
SET HandledSLA =
(
SELECT COUNT(CQD.targetType) AS [Calls Handled SLA]
FROM ACD INNER JOIN
CCD ON ACD.sessionID = CCD.sessionID AND ACD.sessionSeqNum = CCD.sessionSeqNum AND ACD.nodeID = CCD.nodeID AND
ACD.profileID = CCD.profileID INNER JOIN
CQD ON ACD.sessionID = CQD.sessionID AND ACD.sessionSeqNum = CQD.sessionSeqNum AND ACD.profileID = CQD.profileID AND
ACD.nodeID = CQD.nodeID INNER JOIN
CSQ ON CQD.targetID = CSQ.recordID AND CQD.profileID = CSQ.profileID INNER JOIN
Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
WHERE (CCD.startDateTime > CONVERT(DATETIME, #start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, #end, 102)) AND
(CCD.contactDisposition = 2) AND (ACD.talkTime > 0) AND (CQD.targetType = 0) AND (CQD.disposition = 2) AND (CQD.metServiceLevel = 1)
AND Queues.csqname = #queue
)
FROM ACD INNER JOIN
CCD ON ACD.sessionID = CCD.sessionID AND ACD.sessionSeqNum = CCD.sessionSeqNum AND ACD.nodeID = CCD.nodeID AND
ACD.profileID = CCD.profileID INNER JOIN
CQD ON ACD.sessionID = CQD.sessionID AND ACD.sessionSeqNum = CQD.sessionSeqNum AND ACD.profileID = CQD.profileID AND
ACD.nodeID = CQD.nodeID INNER JOIN
CSQ ON CQD.targetID = CSQ.recordID AND CQD.profileID = CSQ.profileID INNER JOIN
Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
WHERE (CCD.startDateTime > CONVERT(DATETIME, #start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, #end, 102)) AND
(CCD.contactDisposition = 2) AND (ACD.talkTime > 0) AND (CQD.targetType = 0) AND (CQD.disposition = 2) AND (CQD.metServiceLevel = 1)
AND Queues.csqname = #queue
UPDATE #temp
SET AvgTalkTime =
(
SELECT (SUM(CQD.queueTime)/Count(CQD.queueTime)) AS [AverageQueueTime]
FROM CCD INNER JOIN
CQD ON CCD.sessionID = CQD.sessionID AND CCD.sessionSeqNum = CQD.sessionSeqNum AND CCD.nodeID = CQD.nodeID AND
CCD.profileID = CQD.profileID INNER JOIN
CSQ ON CQD.targetID = CSQ.recordID AND CQD.profileID = CSQ.profileID INNER JOIN
Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
WHERE (CQD.targetType = 0) AND (CCD.startDateTime > CONVERT(DATETIME, #start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, #end, 102)) AND Queues.csqname = #queue
)
FROM CCD INNER JOIN
CQD ON CCD.sessionID = CQD.sessionID AND CCD.sessionSeqNum = CQD.sessionSeqNum AND CCD.nodeID = CQD.nodeID AND
CCD.profileID = CQD.profileID INNER JOIN
CSQ ON CQD.targetID = CSQ.recordID AND CQD.profileID = CSQ.profileID INNER JOIN
Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
WHERE (CQD.targetType = 0) AND (CCD.startDateTime > CONVERT(DATETIME, #start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, #end, 102)) AND Queues.csqname = #queue
UPDATE #temp
SET AvgWaitTime =
(
SELECT (SUM(ACD.talkTime) / COUNT(CQD.targetType)) AS [AverageTalkTime]
FROM ACD INNER JOIN
CCD ON ACD.sessionID = CCD.sessionID AND ACD.sessionSeqNum = CCD.sessionSeqNum AND ACD.nodeID = CCD.nodeID AND
ACD.profileID = CCD.profileID INNER JOIN
CQD ON ACD.sessionID = CQD.sessionID AND ACD.sessionSeqNum = CQD.sessionSeqNum AND ACD.profileID = CQD.profileID AND
ACD.nodeID = CQD.nodeID INNER JOIN
CSQ ON CQD.targetID = CSQ.recordID AND CQD.profileID = CSQ.profileID INNER JOIN
Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
WHERE (CCD.startDateTime > CONVERT(DATETIME, #start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, #end, 102)) AND
(CCD.contactDisposition = 2) AND (ACD.talkTime > 0) AND (CQD.targetType = 0) AND (CQD.disposition = 2)
AND Queues.csqname = #queue
)
FROM ACD INNER JOIN
CCD ON ACD.sessionID = CCD.sessionID AND ACD.sessionSeqNum = CCD.sessionSeqNum AND ACD.nodeID = CCD.nodeID AND
ACD.profileID = CCD.profileID INNER JOIN
CQD ON ACD.sessionID = CQD.sessionID AND ACD.sessionSeqNum = CQD.sessionSeqNum AND ACD.profileID = CQD.profileID AND
ACD.nodeID = CQD.nodeID INNER JOIN
CSQ ON CQD.targetID = CSQ.recordID AND CQD.profileID = CSQ.profileID INNER JOIN
Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
WHERE (CCD.startDateTime > CONVERT(DATETIME, #start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, #end, 102)) AND
(CCD.contactDisposition = 2) AND (ACD.talkTime > 0) AND (CQD.targetType = 0) AND (CQD.disposition = 2)
AND Queues.csqname = #queue
INSERT INTO [db_cra].[dbo].[CallData]
([CSQName]
,[Presented]
,[Handled]
,[Abandonded]
,[Dequeued]
,[HandledSLA]
,[AbandondedSLA]
,[AvgTalkTime]
,[AvgWaitTime]
,[Date])
SELECT * FROM #Temp
END

Resources