How to execute 2 SQL statements inside a CASE - sql-server

I have the following SQL query statement:
INSERT INTO #mt_API
SELECT
[dbo].fn_AddTimeZoneOffset(APHIST.ActionDate,'CET') AS ASDATE
, [dbo].fn_AddTimeZoneOffset(APHIST.ReturnDate,'CET') AS ATDATE
,API_HIST.[ActionPlanItemID]
,API_HIST.[ActionPlanID]
,PIT.[ProductItemID]
,PIT.ProductItemCode
,PIT.QRCode
,PIT.Name
,ISNULL((SELECT TOP 1 mRSP.TotalRemainingAtStore FROM #mt_RemainingStockProduct AS mRSP
WHERE mRSP.InventoryDate <= APHIST.ReturnDate
ORDER BY mRSP.InventoryDate DESC), 0) AS StoreTotalStock
,P.[Weight] AS ItemWeight
,M.UnitMeasureCode as Unit
,PIT.Quantity AS ItemQuantity
,P.ItemUnitWeight
,P.Quantity as ProductQuantity
,E1.FullName AS Emp1
,E2.FullName AS Emp2
,E3.FullName AS Emp3
,E4.FullName AS Emp4
,SECT.Name AS Sector
,CASE WHEN n=0 then 0 else [ItemStatus] end as [ItemStatus]
,APHIST.IsActionOver as ActionOver
FROM
[Sales].[ActionPlanItem_History] AS API_HIST
INNER JOIN
[Sales].[ActionPlan_History] AS APHIST On APHIST.ActionPlanID = API_HIST.ActionPlanID
INNER JOIN
[Production].[ProductItem] AS PIT ON API_HIST.ProductItemID =PIT.ProductItemID
INNER JOIN
Production.Product as P ON PIT.ProductID = P.ProductID AND PIT.ProductID = P.ProductID AND
PIT.ProductID = P.ProductID
INNER JOIN
Production.UnitMeasure as M ON M.UnitMeasureID = P.WeightUnitMeasureID
LEFT OUTER JOIN
Sales.Employee AS E1 ON APHIST.EmployeeID1 = E1.EmployeeID
LEFT OUTER JOIN
Sales.Employee AS E2 ON APHIST.EmployeeID2 = E2.EmployeeID
LEFT OUTER JOIN
Sales.Employee AS E3 ON APHIST.EmployeeID3 = E3.EmployeeID
LEFT OUTER JOIN
Sales.Employee AS E4 ON APHIST.EmployeeID4 = E4.EmployeeID
INNER JOIN
Sales.Sector AS SECT ON APHIST.SectorID = SECT.SectorID
INNER JOIN
Production.ProductSubcategory as PS on P.ProductSubcategoryID=PS.ProductSubcategoryID
INNER JOIN
Production.ProductCategory as PC on PS.ProductCategoryID= PC.ProductCategoryID
CROSS APPLY (Values(0),(1)) d(n)
WHERE P.StoreID=#StoreID
--WHERE PC.ProductCategoryID=#RootCategory AND P.StoreID=#StoreID
--ORDER BY ProductItemCode, ATDATE
ORDER BY ASDATE , ProductItemCode
SELECT
API1.ASDATE AS StartDate
,API1.ATDATE AS ReturnDate
,API1.ActionPlanItemID
,API1.ActionPlanID
,API1.ProductItemID
,API1.ProductItemCode
,API1.QRCode
,API1.Name
,API1.StoreTotalStock
,API1.ItemWeight
,API1.ItemQuantity
,API1.ItemUnitWeight
,API1.Unit
,API1.ProductQuantity
,API1.Emp1
,API1.Emp2
,API1.Emp3
,API1.Emp4
,API1.Sector
,API1.ItemStatus
,API1.ActionOver
,(API1.StoreTotalStock +
(SELECT SUM(
CASE API2.ItemStatus
WHEN 0 THEN -1
WHEN 1 THEN 1
ELSE 0
END * API2.ItemUnitWeight)
FROM #mt_API AS API2
WHERE API2.ID <= API1.ID
)
-
(
**select
case ISNULL(SUM([ProductItemWeight]), 0)
when 0 then 0
else SUM([ProductItemWeight])
end
from [ExplosiveTracking].[Production].[TransfertHistory]
where stuff(convert(varchar(20),TransfertDateTime,120),17,6,'') < stuff(convert(varchar(20),API1.ASDATE,120),17,6,'')**
)
) AS ItemWeightBal
FROM #mt_API AS API1
Inside the CASE statement I am returning the SUM([ProductItemWeight]) if it is not NULL, but then at same time, I need to execute the following inside the same CASE :
delete from #tempTransfert
where stuff(convert(varchar(20),#tempTransfert.TransferDate,120),17,6,'') < stuff(convert(varchar(20),API1.ASDATE,120),17,6,'')
ADDED MORE TEST :
If I run what I wan to accomplish in a standalone new query as below then the DELETE and SELECT works find inside the CASE
CREATE TABLE #tempTransfert
(
[ID] uniqueidentifier,
[ProductId] int,
[SourceId] int,
TransferDate DateTime,
TotalMovedProduct DECIMAL(16,4)
)
Insert into #tempTransfert
select
[ID],[ProductId], [SourceId], stuff(convert(varchar(20),TransfertDateTime,120),17,6,'') as TransferDate, SUM([ProductItemWeight]) as TotalMovedProduct
from [ExplosiveTracking].[Production].[TransfertHistory]
group by [ProductId],ID, [SourceId], stuff(convert(varchar(20),TransfertDateTime,120),17,6,'')
select * from #tempTransfert
MERGE #tempTransfert AS T
USING (select
case ISNULL(SUM([ProductItemWeight]) , 0)
when 0 then 0
else SUM([ProductItemWeight])
end
, ID
from [ExplosiveTracking].[Production].[TransfertHistory]
where stuff(convert(varchar(20),TransfertDateTime,120),17,6,'') < stuff(convert(varchar(20),'2017-02-28 15:38:00',120),17,6,'')
Group by ID
) as S ([ProductItemWeight],ID)
ON (T.ID = S.ID)
WHEN MATCHED
THEN DELETE;
BUT when I added in the complete query as below , I have a SYNTAX error near MERGE reported :
DECLARE #m_StoreTotalStock AS DECIMAL(18,3)
DECLARE #mt_API AS TABLE
(
ID INT IDENTITY(1,1), ASDATE DATETIME,ATDATE DATETIME,
ActionPlanItemID INT, ActionPlanID INT,
ProductItemID INT, ProductItemCode VARCHAR(50),
QRCode VARCHAR(50), Name VARCHAR(50),
StoreTotalStock decimal(18,3), ItemWeight decimal(18,3),
Unit VARCHAR(50), ItemQuantity INT,
ItemUnitWeight DECIMAL(18,4), ProductQuantity INT,
Emp1 VARCHAR(50), Emp2 VARCHAR(50),
Emp3 VARCHAR(50), Emp4 VARCHAR(50),
Sector VARCHAR(50), ItemStatus TINYINT,ActionOver INt
)
DECLARE #mt_RemainingStockProduct AS TABLE
(
StoreID INT,InventoryDate DATETIME,ProductID INT, TotalRemainingAtStore DECIMAL(18,2)
)
CREATE TABLE #tempTransfert
(
[ID] uniqueidentifier,
[ProductId] int,
[SourceId] int,
TransferDate DateTime,
TotalMovedProduct DECIMAL(16,4)
)
Insert into #tempTransfert
select
[ID],[ProductId], [SourceId], stuff(convert(varchar(20),TransfertDateTime,120),17,6,'') as TransferDate, SUM([ProductItemWeight]) as TotalMovedProduct
from [ExplosiveTracking].[Production].[TransfertHistory]
group by [ProductId],ID, [SourceId], stuff(convert(varchar(20),TransfertDateTime,120),17,6,'')
select * from #tempTransfert
/** Get Remaining StockBy Product **/
INSERT INTO #mt_RemainingStockProduct
(
StoreID, InventoryDate, ProductID,TotalRemainingAtStore
)
--SELECT InventoryDate, SUM(TotalRemainingAtStore) AS TotalRemainingAtStore FROM
--(
SELECT StoreID, InventoryDate, ProductID, SUM(Remaining) OVER (PARTITION BY StoreID ) AS TotalRemainingAtStore FROM
(
SELECT
P.StoreID, P.InventoryDate, P.ProductID,
--SUM(PIT.Quantity * P.ItemUnitWeight)-SUM(PIT.UsedQuantity * P.ItemUnitWeight) AS Remaining
SUM(PIT.Quantity * P.ItemUnitWeight) AS Remaining
FROM Sales.Store AS S
INNER JOIN Production.ProductItem AS PIT
INNER JOIN Production.Product AS P ON PIT.ProductID = P.ProductID
INNER JOIN Production.UnitMeasure AS UM ON P.WeightUnitMeasureID = UM.UnitMeasureID ON
S.BusinessEntityID = P.StoreID
INNER JOIN Production.Location AS LOC ON S.BusinessEntityID = LOC.StoreID AND
P.LocationID = LOC.LocationID AND P.LocationID = LOC.LocationID
WHERE (P.IsDeleted = 0) AND (PIT.IsDeleted = 0) AND P.StoreID = 4
GROUP BY P.StoreID,P.InventoryDate, P.ProductID, UM.UnitMeasureCode, S.Name, LOC.MaxQuantity
) AS RST1
--) AS RST2
--GROUP BY RST2.InventoryDate
/** Endof Get Remaining StockBy Product **/
-- Get Store total product items weight
SELECT #m_StoreTotalStock = SUM(PIW.TotalWeight)
FROM dbo.v_ProductItemWeight AS PIW
WHERE StoreID = 4
INSERT INTO #mt_API
SELECT [dbo].fn_AddTimeZoneOffset(APHIST.ActionDate,'CET') AS ASDATE
, [dbo].fn_AddTimeZoneOffset(APHIST.ReturnDate,'CET') AS ATDATE
,API_HIST.[ActionPlanItemID]
,API_HIST.[ActionPlanID]
,PIT.[ProductItemID]
,PIT.ProductItemCode
,PIT.QRCode
,PIT.Name
,ISNULL((SELECT TOP 1 mRSP.TotalRemainingAtStore FROM #mt_RemainingStockProduct AS mRSP
WHERE mRSP.InventoryDate <= APHIST.ReturnDate
ORDER BY mRSP.InventoryDate DESC), 0) AS StoreTotalStock
,P.[Weight] AS ItemWeight
,M.UnitMeasureCode as Unit
,PIT.Quantity AS ItemQuantity
,P.ItemUnitWeight
,P.Quantity as ProductQuantity
,E1.FullName AS Emp1
,E2.FullName AS Emp2
,E3.FullName AS Emp3
,E4.FullName AS Emp4
,SECT.Name AS Sector
,CASE WHEN n=0 then 0 else [ItemStatus] end as [ItemStatus]
,APHIST.IsActionOver as ActionOver
FROM
[Sales].[ActionPlanItem_History] AS API_HIST
INNER JOIN
[Sales].[ActionPlan_History] AS APHIST On APHIST.ActionPlanID = API_HIST.ActionPlanID
INNER JOIN
[Production].[ProductItem] AS PIT ON API_HIST.ProductItemID =PIT.ProductItemID
INNER JOIN
Production.Product as P ON PIT.ProductID = P.ProductID AND PIT.ProductID = P.ProductID AND
PIT.ProductID = P.ProductID
INNER JOIN
Production.UnitMeasure as M ON M.UnitMeasureID = P.WeightUnitMeasureID
LEFT OUTER JOIN
Sales.Employee AS E1 ON APHIST.EmployeeID1 = E1.EmployeeID
LEFT OUTER JOIN
Sales.Employee AS E2 ON APHIST.EmployeeID2 = E2.EmployeeID
LEFT OUTER JOIN
Sales.Employee AS E3 ON APHIST.EmployeeID3 = E3.EmployeeID
LEFT OUTER JOIN
Sales.Employee AS E4 ON APHIST.EmployeeID4 = E4.EmployeeID
INNER JOIN
Sales.Sector AS SECT ON APHIST.SectorID = SECT.SectorID
INNER JOIN
Production.ProductSubcategory as PS on P.ProductSubcategoryID=PS.ProductSubcategoryID
INNER JOIN
Production.ProductCategory as PC on PS.ProductCategoryID= PC.ProductCategoryID
CROSS APPLY (Values(0),(1)) d(n)
WHERE P.StoreID=4
--WHERE PC.ProductCategoryID=#RootCategory AND P.StoreID=#StoreID
--ORDER BY ProductItemCode, ATDATE
ORDER BY ASDATE , ProductItemCode
SELECT
API1.ASDATE AS StartDate
,API1.ATDATE AS ReturnDate
,API1.ActionPlanItemID
,API1.ActionPlanID
,API1.ProductItemID
,API1.ProductItemCode
,API1.QRCode
,API1.Name
,API1.StoreTotalStock
,API1.ItemWeight
,API1.ItemQuantity
,API1.ItemUnitWeight
,API1.Unit
,API1.ProductQuantity
,API1.Emp1
,API1.Emp2
,API1.Emp3
,API1.Emp4
,API1.Sector
,API1.ItemStatus
,API1.ActionOver
,(API1.StoreTotalStock +
(SELECT SUM(
CASE API2.ItemStatus
WHEN 0 THEN -1
WHEN 1 THEN 1
ELSE 0
END * API2.ItemUnitWeight)
FROM #mt_API AS API2
WHERE API2.ID <= API1.ID
)
-
--select
-- case ISNULL(SUM([ProductItemWeight]), 0)
-- when 0 then 0
-- else SUM([ProductItemWeight])
-- end
--from [ExplosiveTracking].[Production].[TransfertHistory]
--where stuff(convert(varchar(20),TransfertDateTime,120),17,6,'') < stuff(convert(varchar(20),API1.ASDATE,120),17,6,'')
(
**MERGE #tempTransfert AS T
USING (select
case ISNULL(SUM([ProductItemWeight]) , 0)
when 0 then 0
else SUM([ProductItemWeight])
end
, ID
from [ExplosiveTracking].[Production].[TransfertHistory]
where stuff(convert(varchar(20),TransfertDateTime,120),17,6,'') < stuff(convert(varchar(20),API1.ASDATE,120),17,6,'')
Group by ID
) as S ([ProductItemWeight],ID)
ON (T.ID = S.ID)
WHEN MATCHED
THEN DELETE;
)**
) AS ItemWeightBal
FROM #mt_API AS API1
END
The MERGE part is suppose to first return the SUM of ItemWeight within a DateTime range, then when those records has been read, I need to delete them from #tempTransfert table otherwise, on the next loop it will read all records again
Any idea what syntax error can it be ?
Thanks for your help on this
Regards

Related

SQL Stored procedure Inserts instead of update

I have a stored procedure that checks if a record exist and if true then should update else it should insert. But for some weird reason the update does not work and it inserts a record. As a result I have now accumulated duplicate records in the table. How do I ensure that the update works separately from the insert.
CREATE PROCEDURE [dbo].[proc_CustomerAnalysis_Insert]
(
#CustomerID INT,
#UserID INT,
#ProcessCompleted BIT,
#DeliveryDate DATETIME,
#HasOpsNote BIT,
#OpsNote VARCHAR(500),
#isManual BIT,
#FinalStageID INT,
#EffectiveDate DATE,
#Outcome VARCHAR(50),
#ExculdeFromReview BIT
)
AS
BEGIN
DECLARE #TempCustomerAnalysis TABLE
(
CustomerID INT ,
IncreaseDate DATETIME,
Ref VARCHAR(50),
RateIncreaseID INT,
rn INT
)
IF EXISTS(SELECT CustomerID FROM DUmmy9 WHERE DUmmy9.CustomerID = #CustomerID)
BEGIN
WITH UpdateData AS
(
SELECT DISTINCT *
FROM (
SELECT
c.CustomerID CustomerID,
ri.RateIncreasePeriod IncreaseDate,
CONCAT(c.FWRepCode, '\', c.AccountCode) Ref,
ri.RateIncreaseID RateIncreaseID,
u.Name,
row_number() OVER(PARTITION BY c.Name ORDER BY ri.RateIncreasePeriod DESC) AS rn
FROM customers c
left outer join DUmmy1 rc on rc.RateClassID = c.RateClassID
left outer join DUmmy2 css on css.CustomerStatusID = c.CustomerStatusID
left outer join DUmmy3 ri on ri.RateCycleID = rc.RateCycleID
left outer join DUmmy4 fwrm ON fwrm.FWCode = c.FWRepCode
left outer join DUmmy5 rcs ON rcs.RepCodeID = fwrm.RepCodeID
left outer join DUmmy6 u ON u.UserID = rcs.UserID
left outer join DUmmy7 vw on vw.CustomerID = c.CustomerID
WHERE c.CustomerStatusID = 3 AND u.UserID = #UserID AND c.CustomerID = #CustomerID
) t
WHERE t.rn = 1
)
UPDATE DUmmy7
SET IncreaseDate = DUmmy8.IncreaseDate, Ref = DUmmy8.Ref, RateIncreaseID = DUmmy8.RateIncreaseID
FROM UpdateData
WHERE DUmmy8.CustomerID = #CustomerID
END
ELSE
BEGIN
INSERT INTO #TempCustomerAnalysis(CustomerID, IncreaseDate, Ref, RateIncreaseID, rn)
SELECT DISTINCT *
FROM (
SELECT
c.CustomerID CustomerID,
ri.RateIncreasePeriod IncreaseDate,
CONCAT(c.FWRepCode, '\', c.AccountCode) Ref,
ri.RateIncreaseID RateIncreaseID,
row_number() OVER(PARTITION BY c.Name ORDER BY ri.RateIncreasePeriod DESC) AS rn
FROM customers c
left outer join DUmmy1 rc on rc.RateClassID = c.RateClassID
left outer join DUmmy2 css on css.CustomerStatusID = c.CustomerStatusID
left outer join DUmmy3 ri on ri.RateCycleID = rc.RateCycleID
left outer join DUmmy4 fwrm ON fwrm.FWCode = c.FWRepCode
left outer join DUmmy5 rcs ON rcs.RepCodeID = fwrm.RepCodeID
left outer join DUmmy6 u ON u.UserID = rcs.UserID
left outer join DUmmy7 vw on vw.CustomerID = c.CustomerID
WHERE c.CustomerStatusID = 3 AND u.UserID = #UserID AND c.CustomerID = #CustomerID
) t
WHERE t.rn = 1
INSERT INTO DUmmy9(CustomerID, IncreaseDate, ProcessCompleted, DeliveryDate, Ref, HasOpsNote, OpsNote, RateIncreaseID, isManual, FinalStageID, EffectiveDate, Outcome, ExcludeFromReview)
SELECT
CustomerID,
IncreaseDate,
#ProcessCompleted,
#DeliveryDate,
Ref,
#HasOpsNote,
#OpsNote,
RateIncreaseID,
#isManual,
#FinalStageID,
#EffectiveDate,
#Outcome,
#ExculdeFromReview
FROM #TempCustomerAnalysis
END
END
From looking at your example. You never set CustomerAnalysis.CustomerID = #CustomerID before you check the IF ELSE, so that value is always NULL/ never exists in the CustomerAnalysis so ALWAYS goes into the ELSE.
DECLARE #CustomerIDExist INT = (SELECT COUNT(CustomerID) FROM CustomerAnalysis WHERE CustomerAnalysis.CustomerID = #CustomerID)
IF (#CustomerIDExist >= 1)
BEGIN

SQL Pivot as a sub query

I have the below code:
DECLARE #lcid INT
DECLARE #startdate DATETIME=#10
DECLARE #enddate DATETIME=#11
DECLARE #PitchJobTypeId INT
DECLARE #ClientInvestmentJobTypeId INT
DECLARE #AdministrationJobTypeId INT
IF OBJECT_ID('tempdb..#data') IS NOT NULL
DROP TABLE #data
DECLARE #Billablejob TABLE(
id INT IDENTITY(1,1),
Jobid INT)
DECLARE #Department table(
Id INT IDENTITY(1,1),
DepartmentId INT)
IF #10 > #11
BEGIN
SELECT 'Error in date selection' AS 'Error';
GOTO ExitSp;
END
INSERT INTO #Billablejob(Jobid)
SELECT distinct s.Element FROM dbo.Split(#30,',') AS s
Insert into #Department(DepartmentId)
SELECT distinct s.Element FROM dbo.Split(#5,',') AS s
IF EXISTS(SELECT '' FROM #Department AS d WHERE d.DepartmentId=0) OR NOT EXISTS(SELECT '' FROM #Department AS d) BEGIN
DELETE FROM #Department
INSERT INTO #Department(DepartmentId)
SELECT rsa.AfdID FROM RessSelAfd AS rsa --INNER JOIN #comp c ON c.compid=rsa.SelID
END
IF #20 IS NULL SET #20=0
CREATE TABLE #data(
ID INT IDENTITY(1,1),
[Name] nvarchar(MAX),
[Employee Type] nvarchar(MAX),
[Basic Time] money,
[Used Time] MONEY,
[Holiday] MONEY,
[Recovery] MONEY,
[Illness] MONEY,
[Billable Time] MONEY,
[Non Billable Time] MONEY,
[Pitch Time] MONEY,
[Internal Time] MONEY,
[Used Time2] MONEY,
[Max Billable Hours] MONEY,
[Available Hours] MONEY,
[Office Hours %] INT,
[Billable %] INT,
[Non Billable %] INT,
[Pitch %] INT,
[Internal %] INT,
[Billable Target %] INT,
[Variance to Target %] INT,
[Department] NVARCHAR(max),
[Job Role] NVARCHAR(max),
[Market] NVARCHAR(max),
EmpId INT,
DepartmentId INT,
JobRoleId INT,
MarketId INT,
IsActive BIT,
Hiredate DATETIME,
Expirydate DATETIME,
EmployeeType INT
)
IF #10>#11 BEGIN
SELECT 'Date selection error' Error
GOTO ExitSp
END
SELECT #PitchJobTypeId = sj.JobTypeID FROM SysJobtype AS sj WHERE sj.JobtypeNavn='Pitch'
IF #PitchJobTypeId IS NULL BEGIN
SELECT 'Jobtype ''Pitch'' not found' Error
GOTO ExitSp
END
SELECT #ClientInvestmentJobTypeId = sj.JobTypeID FROM SysJobtype AS sj WHERE sj.JobtypeNavn='Client Investment'
IF #ClientInvestmentJobTypeId IS NULL BEGIN
SELECT 'Jobtype ''Client Investment'' not found' Error
GOTO ExitSp
END
SELECT #AdministrationJobTypeId = sj.JobTypeID FROM SysJobtype AS sj WHERE sj.JobtypeNavn='Administration'
IF #AdministrationJobTypeId IS NULL BEGIN
SELECT 'Jobtype ''Administration'' not found' Error
GOTO ExitSp
END
SELECT #lcid=InterfaceLcid FROM ress WHERE ressid=#UserId
INSERT INTO #data( empid,[Name],[Billable Target %],[JobRoleId],[Job Role],DepartmentId,MarketId,IsActive,Hiredate,Expirydate,EmployeeType,[Employee Type])
SELECT emp.empid,EmpName,(SELECT TOP 1 ehp.ProfitTarget*100 FROM EmpHrsPrice AS ehp WHERE ehp.EmpId = emp.empid AND ehp.ValidFrom <= #enddate ORDER BY ehp.ValidFrom desc),emppost.PostId,
(SELECT ISNULL(nullif(ActLang.ActTxt,''), Act.ActTxt)
FROM Act
LEFT JOIN ActLang
ON Act.AID = ActLang.Aid
AND ActLang.LCID=#LCID
WHERE Act.AID=emp.aid),emp.DepartmentId,emp.CompId,emp.IsActive,emp.Hiredate,emp.Expirydate,emp.EmployTypeId,CASE WHEN et.enumval=1 OR et.enumval=2 THEN 'Permanent' ELSE 'Freelance' END FROM emp
INNER JOIN ress ON ress.RessID=emp.EmpId
INNER JOIN #Department AS d ON d.DepartmentId = Emp.DepartmentId
LEFT JOIN emppost ON emp.PostId=emppost.PostId
LEFT JOIN EnumTable(467) AS et ON et.EnumVal=emp.EmployTypeId
WHERE (IsActive=1 OR (Expirydate>=#startdate and Expirydate<=#enddate)) AND (CASE WHEN emp.EmployTypeId=2 THEN 1 ELSE emp.EmployTypeId END=#20 OR #20=0) AND Ress.UserAcountType<>5
UPDATE d SET d.Department=rsa.AfdNavn FROM #data d INNER JOIN RessSelAfd AS rsa ON d.DepartmentId=rsa.AfdID
UPDATE d SET d.Market=comp.CompName FROM #data d INNER JOIN comp ON d.MarketId=comp.compid
UPDATE d SET d.[Basic Time]=data.HrsNorm FROM #data d INNER JOIN
(SELECT cap.ResId,Sum(ISNULL(Cap.HrsNorm,0)+ISNULL(Cap.HrsHoli,0)) AS HrsNorm FROM cap INNER JOIN #data d ON d.empid=cap.ResId AND CAST(DayDate AS DATE) BETWEEN #startdate AND #enddate
GROUP BY cap.ResId) data ON d.EmpId=data.ResId
UPDATE d SET d.[Used Time]=data.UsedHours FROM #data d INNER JOIN
(SELECT tr.EmpId,SUM(tr.RegHrs) AS UsedHours FROM TimeReg AS tr WHERE CAST(RegDate AS DATE) BETWEEN #startdate AND #enddate
and reghrs IS NOT null
GROUP BY tr.EmpId ) data ON d.EmpId=data.EmpId
UPDATE d SET [Basic Time]=[Used Time],d.[Billable Target %]=100 FROM #data d WHERE EmployeeType=3
UPDATE d SET [Basic Time]=ISNULL([Basic Time],0),[Used Time]=ISNULL([Used Time],0) FROM #data d
UPDATE d
SET d.Holiday = data.UsedHours
FROM #data d
INNER JOIN
(
SELECT tr.EmpId,SUM(tr.RegHrs) AS UsedHours
FROM TimeReg AS tr
INNER JOIN RessFerie AS rf ON rf.RecId=tr.EmpHoliRecId
INNER JOIN AbsenceCode AS ac ON ac.Id=rf.AbsenceID
INNER JOIN job ON Job.JobID = tr.JobId
INNER JOIN RessProjekter AS rp ON rp.ProjektID = Job.ProjektID
INNER JOIN CUST ON cust.CustId=rp.RessID
WHERE CAST(RegDate AS DATE) BETWEEN #startdate AND #enddate AND RegHrs IS NOT NULL AND cust.CustTypeId=5 AND job.JobTypeID<>#PitchJobTypeId AND ac.Descr<>'Recovery Day'
GROUP BY tr.EmpId
) data ON d.EmpId = data.EmpId;
UPDATE d
SET d.Recovery = data.UsedHours
FROM #data d
INNER JOIN
(
SELECT tr.EmpId,SUM(tr.RegHrs) AS UsedHours
FROM TimeReg AS tr
INNER JOIN RessFerie AS rf ON rf.RecId=tr.EmpHoliRecId
INNER JOIN AbsenceCode AS ac ON ac.Id=rf.AbsenceID
INNER JOIN job ON Job.JobID = tr.JobId
INNER JOIN RessProjekter AS rp ON rp.ProjektID = Job.ProjektID
INNER JOIN CUST ON cust.CustId=rp.RessID
WHERE CAST(RegDate AS DATE) BETWEEN #startdate AND #enddate AND RegHrs IS NOT NULL AND cust.CustTypeId=5 AND job.JobTypeID<>#PitchJobTypeId AND ac.Descr='Recovery Day'
GROUP BY tr.EmpId
) data ON d.EmpId = data.EmpId;
UPDATE d
SET d.Illness = data.UsedHours
FROM #data d
INNER JOIN
(
SELECT tr.EmpId,SUM(tr.RegHrs) AS UsedHours
FROM TimeReg AS tr
INNER JOIN job ON Job.JobID = tr.JobId
INNER JOIN RessProjekter AS rp ON rp.ProjektID = Job.ProjektID
INNER JOIN CUST ON cust.CustId=rp.RessID
WHERE CAST(RegDate AS DATE) BETWEEN #startdate AND #enddate AND RegHrs IS NOT NULL AND cust.CustTypeId=6 AND job.JobTypeID<>#PitchJobTypeId
GROUP BY tr.EmpId
) data ON d.EmpId = data.EmpId;
UPDATE d
SET d.[Billable Time] = data.UsedHours
FROM #data d
INNER JOIN
(
SELECT tr.EmpId,SUM(tr.RegHrs) AS UsedHours
FROM TimeReg AS tr
INNER JOIN job ON Job.JobID = tr.JobId
INNER JOIN RessProjekter AS rp ON rp.ProjektID = Job.ProjektID
INNER JOIN CUST ON cust.CustId=rp.RessID
LEFT JOIN #Billablejob AS bj ON job.JobID=bj.Jobid
WHERE CAST(RegDate AS DATE) BETWEEN #startdate AND #enddate AND RegHrs IS NOT NULL AND (job.DebitFlg=1 OR bj.Jobid IS NOT NULL) AND (cust.CustTypeId=1 OR cust.CustTypeId=2) AND job.JobTypeID<>#PitchJobTypeId AND job.JobTypeID<>#ClientInvestmentJobTypeId AND job.JobTypeID<>#AdministrationJobTypeId
GROUP BY tr.EmpId
) data ON d.EmpId = data.EmpId;
UPDATE d
SET d.[Non Billable Time] = data.UsedHours
FROM #data d
INNER JOIN
(
SELECT tr.EmpId,SUM(tr.RegHrs) AS UsedHours
FROM TimeReg AS tr
INNER JOIN job ON Job.JobID = tr.JobId
INNER JOIN RessProjekter AS rp ON rp.ProjektID = Job.ProjektID
INNER JOIN CUST ON cust.CustId=rp.RessID
LEFT JOIN #Billablejob AS bj ON job.JobID=bj.Jobid
WHERE CAST(RegDate AS DATE) BETWEEN #startdate AND #enddate AND RegHrs IS NOT NULL AND ((bj.Jobid IS NULL and job.DebitFlg=0 AND (cust.CustTypeId=1 OR cust.CustTypeId=2) AND job.JobTypeID<>#PitchJobTypeId AND job.JobTypeID<>#AdministrationJobTypeId) OR job.JobTypeID=#ClientInvestmentJobTypeId)
GROUP BY tr.EmpId
) data ON d.EmpId = data.EmpId;
UPDATE d
SET d.[Pitch Time] = data.UsedHours
FROM #data d
INNER JOIN
(
SELECT tr.EmpId,SUM(tr.RegHrs) AS UsedHours
FROM TimeReg AS tr
INNER JOIN job ON Job.JobID = tr.JobId
INNER JOIN RessProjekter AS rp ON rp.ProjektID = Job.ProjektID
INNER JOIN CUST ON cust.CustId=rp.RessID
WHERE CAST(RegDate AS DATE) BETWEEN #startdate AND #enddate AND RegHrs IS NOT NULL AND tr.EmpHoliRecId IS NULL AND job.JobTypeID=#PitchJobTypeId
GROUP BY tr.EmpId
) data ON d.EmpId = data.EmpId;
UPDATE d
SET d.[Internal Time] = data.UsedHours
FROM #data d
INNER JOIN
(
SELECT tr.EmpId,SUM(tr.RegHrs) AS UsedHours
FROM TimeReg AS tr
INNER JOIN job ON Job.JobID = tr.JobId
INNER JOIN RessProjekter AS rp ON rp.ProjektID = Job.ProjektID
INNER JOIN CUST ON cust.CustId=rp.RessID
WHERE CAST(RegDate AS DATE) BETWEEN #startdate AND #enddate AND RegHrs IS NOT NULL AND tr.EmpHoliRecId IS NULL AND (((cust.CustTypeId=3 OR cust.CustTypeId=4) AND job.JobTypeID<>#PitchJobTypeId AND job.JobTypeID<>#ClientInvestmentJobTypeId) OR job.JobTypeID=#AdministrationJobTypeId)
GROUP BY tr.EmpId
) data ON d.EmpId = data.EmpId;
UPDATE d SET d.[Used Time2]=isnull(d.[Used Time],0)-isnull(d.Recovery,0) FROM #data d
UPDATE d SET d.[Max Billable Hours]=ISNULL(d.[Used Time2],0)-ISNULL(d.Holiday,0)-ISNULL(d.Illness,0) FROM #data d
UPDATE d SET d.[Available Hours]=ISNULL(d.[Basic Time],0)-ISNULL(d.Holiday,0)-ISNULL(d.Illness,0) FROM #data d
UPDATE d SET d.[Office Hours %]=CAST(CASE WHEN ISNULL(d.[Available Hours],0)=0 THEN 0 ELSE d.[Max Billable Hours]/d.[Available Hours]*100 END AS INT) FROM #data d
UPDATE d SET d.[Billable %]=CAST(CASE WHEN ISNULL(d.[Available Hours],0)=0 THEN CASE WHEN ISNULL(d.[Billable Time],0)=0 THEN 100 ELSE 0 END ELSE d.[Billable Time]/d.[Available Hours]*100 END AS INT) FROM #data d
UPDATE d SET d.[Non Billable %]=CAST(CASE WHEN ISNULL(d.[Available Hours],0)=0 THEN 0 ELSE d.[Non Billable Time]/d.[Available Hours]*100 END AS INT) FROM #data d
UPDATE d SET d.[Pitch %]=CAST(CASE WHEN ISNULL(d.[Available Hours],0)=0 THEN 0 ELSE d.[Pitch Time]/d.[Available Hours]*100 END AS INT) FROM #data d
UPDATE d SET d.[Internal %]=CAST(CASE WHEN ISNULL(d.[Available Hours],0)=0 THEN 0 ELSE d.[Internal Time]/d.[Available Hours]*100 END AS INT) FROM #data d
UPDATE d SET d.[Variance to Target %]=ISNULL(d.[Billable %],0)-ISNULL(d.[Billable Target %],0) FROM #data d
SELECT d.Name,
d.[Employee Type],
d.[Basic Time],
d.[Used Time] AS [Total Time posted],
isnull(d.Holiday,0)+isnull(d.Illness,0) [Absence],
d.Recovery,
d.[Billable Time],
d.[Non Billable Time],
d.[Pitch Time],
d.[Internal Time],
isnull(d.[Used Time2],0) AS [Used Time],
d.[Max Billable Hours],
d.[Available Hours],
CAST(d.[Office Hours %] AS NVARCHAR(50))+'%' AS [Office Hours %],
CAST(d.[Billable %] AS NVARCHAR(50))+'%' AS [Billable %],
CAST(d.[Non Billable %] AS NVARCHAR(50))+'%' AS [Non Billable %],
CAST(d.[Pitch %] AS NVARCHAR(50))+'%' AS [Pitch %],
CAST(d.[Internal %] AS NVARCHAR(50))+'%' AS [Internal %],
CAST(d.[Billable Target %] AS NVARCHAR(50))+'%' AS [Billable Target %],
CAST(d.[Variance to Target %] AS NVARCHAR(50))+'%' AS [Variance to Target %],
d.Department,
d.[Job Role],
d.Market
FROM #data d
ExitSp:
That produces a large table containing data similar to below:
I would like to include a Pivot sub query to wrap up various elements of the above original query but cannot seem to get this to work.
I have tried including the below at the beginning of my original script::
SELECT [Department], [Employee Type],[Basic Time]
FROM
(
and then:
) As SourceTable
PIVOT
(
SUM ([Basic Time])
FOR [[Basic Time]] IN ([Employee Type])
) AS PivotTable
At the end but with no luck?
Can anyone help out in the best way to do this?
You need to specify each possible value for Employee Type as column names, for example:
SELECT Name, Department, Permanent AS BasicTime_Permanent, Freelance AS BasicTime_Freelance
FROM
(
SELECT Name, Department, [Employee Type], [Basic Time]
FROM (
...
) x
) As SourceTable
PIVOT (
SUM ([Basic Time])
FOR [Employee Type] IN (Permanent, Freelance)
) AS PivotTable
See the example in the docs.
However, it seems you need multiple PIVOT queries (one for [Basic Time], one for [Total time posted], etc) that should be later joined together (with outer joins). It looks to me as too much trouble for a result that would be too wide anyway.

Stored procedure taking long time when it runs through SSIS package

I have a below procedure which uses 3 temp tables and finally insert into a table. I am using below sp as source (execute sql task) and loading into csv files. When i run this sp from SSMS it runs within 10 seconds, but when I Put into SSIS package it runs for 30 mins and keep on running. Could any of you optimize this SP for SSIS package?
create proc [etl].[payment_report]
#start_date datetime,
#end_date datetime
as
begin
truncate table extract.payment
select
a.bb_acct_id, a.customer_id,
pay.order_id Payment_Order_Id,
aoi.ord_prod_id Ord_Prod_Id,
pd.name, pd.quick_cd
into
#IntialOrders
from
(select *
from stg.payment (NOLOCK)
where order_id is not null) pay
inner join
stg.account a (NOLOCK) on pay.acct_id = a.acct_id
inner join
stg.acct_order ao (NOLOCK) on ao.order_id = pay.order_id
inner join
stg.acct_order_item aoi (NOLOCK) on aoi.order_id = ao.order_id
inner join
stg.ordered_product op (NOLOCK) on op.ord_prod_id = aoi.ord_prod_id
left join
stg.product p (NOLOCK) on p.prod_id = op.prod_id
left join
stg.product_def pd (NOLOCK) on pd.prod_def_id = p.prod_def_id
where
pay.received_date >= #start_date
and pay.received_date < #end_date
and pay.payment_id not in (select payment_id
from stg.op_renewal_history)
create clustered index Idx_Payment_Order_Id on #IntialOrders(Payment_Order_Id)
select
pay.payment_id, gwr.response
into
#gateway_response
from
stg.payment pay (NOLOCK)
inner join
stg.cc_transactions cct (NOLOCK) on cct.payment_id = pay.payment_id
inner join
stg.gateway_response gwr (NOLOCK) on cct.c_c_trans_id = gwr.cc_trans_id
where
pay.posting_status_id = 3
and pay.received_date >= #start_date
and pay.received_date < #end_date
and pay.received_date > '2015-04-15 00:00:00'
select
distinct a.bb_acct_id SP_ACCOUNT_ID
,a.customer_id CP_CUSTOMER_ID
,bu.description BUSINESS_UNIT
,pay.payment_id PAYMENT_ID
,pay.payment_amt AMOUNT
,'SEK' CURRENCY
,Substring(convert(char(19),pay.received_date,126), 1, (len(convert(char(19),pay.received_date,126))-0))+'Z' PAYMENT_DATE
,pt.display_name PAYMENT_METHOD
,post.description PAYMENT_STATUS
,pay.retries PAYMENT_RETRIES
,case when (pay.for_bill_id is not null or orh.op_id is not null) then 'Renewal' else 'OneTime' end as PAYMENT_TYPE
,case when pay.posting_status_id =3 then gwr.response else '' end as FAILURE_REASON
,case when op.ord_prod_id is null then ino.name else pd.name end SUBSCRIPTION_NAME
,case when op.ord_prod_id is null then ino.quick_cd else pd.quick_cd end SKU
,case when op.ord_prod_id is null then ino.Ord_Prod_Id else op.ord_prod_id end ORD_PROD_ID
,convert(char(19),GETDATE(),126)+'Z' EXPORT_TIME
,case when (pay.posting_status_id =3 and pay.retries = 3 ) then 'T' else 'F' end FAILED_EXTENDED_RETRY
into #payment
from stg.payment pay (NOLOCK)
left join #IntialOrders ino (NOLOCK) on
ino.Payment_Order_Id=pay.order_id
left join stg.account a (NOLOCK) on
a.acct_id = pay.acct_id
left join stg.business_unit bu (NOLOCK) on
a.bu_id=bu.bu_id
left join stg.payment_method pm (NOLOCK) on
pm.pay_method_id=pay.payment_method_id
left join stg.payment_type pt (NOLOCK) on
pt.id=pm.type_id
left join stg.posting_status post (NOLOCK) on
post.id=pay.posting_status_id
left join stg.op_renewal_history orh (NOLOCK) on
orh.payment_id = pay.payment_id
left join stg.ordered_product op (NOLOCK) on
op.ord_prod_id = orh.op_id
left join stg.product p (NOLOCK) on
p.prod_id = op.prod_id
left join stg.product_def pd (NOLOCK) on
pd.prod_def_id = p.prod_def_id
left join #gateway_reponse gwr (NOLOCK) on
gwr.payment_id = pay.payment_id
where
a.bu_id=1
and (a.acct_role_id is null or a.acct_role_id !=4)
and (pay.posting_status_id=2 or (pay.posting_status_id =3
and pay.retries = 3
and op.acct_status_id=3))
and pay.received_date >=#start_date
and pay.received_date < #end_date
and pay.received_date > '2015-04-15 00:00:00'
insert into extract.payment
(
SP_ACCOUNT_ID
,CP_CUSTOMER_ID
,BUSINESS_UNIT
,PAYMENT_ID
,AMOUNT
,CURRENCY
,PAYMENT_DATE
,PAYMENT_METHOD
,PAYMENT_STATUS
,PAYMENT_RETRIES
,PAYMENT_TYPE
,FAILURE_REASON
,SUBSCRIPTION_NAME
,SKU,ORD_PROD_ID
,EXPORT_TIME
,FAILED_EXTENDED_RETRY
)
select
cast(p.SP_ACCOUNT_ID as varchar(50)) SP_ACCOUNT_ID
,cast(p.CP_CUSTOMER_ID as varchar(50)) CP_CUSTOMER_ID
,cast(p.BUSINESS_UNIT as varchar(500)) BUSINESS_UNIT
,cast( p.PAYMENT_ID as varchar(50)) PAYMENT_ID, p.AMOUNT
,cast( p.CURRENCY as varchar(50)) CURRENCY
,cast( p.PAYMENT_DATE as varchar(50)) PAYMENT_DATE
,cast( p.PAYMENT_METHOD as varchar(50)) PAYMENT_METHOD
,cast(p.PAYMENT_STATUS as varchar(50)) PAYMENT_STATUS
,cast( p.PAYMENT_RETRIES as varchar(50)) PAYMENT_RETRIES
,cast(p.PAYMENT_TYPE as varchar(50)) PAYMENT_TYPE
,cast( p.FAILURE_REASON as varchar(4000)) FAILURE_REASON
,cast(p.SUBSCRIPTION_NAME as varchar(500)) SUBSCRIPTION_NAME
,cast(p.SKU as varchar(50)) SKU
,cast(p.ORD_PROD_ID as varchar(50)) ORD_PROD_ID
,cast( p.EXPORT_TIME as varchar(50)) EXPORT_TIME
,p.FAILED_EXTENDED_RETRY
from #payment p
order by p.PAYMENT_DATE
Drop table #IntialOrders
Drop table #gateway_reponse
Drop table #payment
END

How to merge null column in sql table

I want to merge null column with same username or userid where quarter is different, like if username is same for quarter1,2,3, according to below query it is showing same username with different quarter in different row, but i want in same row with different quarter and same user name
ALTER PROCEDURE [dbo].[test]
--#USERID UNIQUEIDENTIFIER,
#BASESTARTDATE DATE,
#BASEENDDATE DATE,
#CASETYPEID VARCHAR(40),
#GROUPTYPE VARCHAR(40),
#COMPANYID VARCHAR(40),
#DEPTID VARCHAR(40)
AS
BEGIN
SET NOCOUNT ON
--CREATE TEMPORARY TABLE FOR INSERTING CALCULATED QUARTER
CREATE TABLE #QUARTERTEMP(QUARTER VARCHAR(10),STARTDATE DATE,ENDDATE DATE,COUNTROW INT)
DECLARE #STARTDATETEMP DATETIME
DECLARE #ENDDATETEMP DATETIME
DECLARE #COUNTQUARTER INT
DECLARE #COUNTERCOUNT INT
SELECT #STARTDATETEMP=#BASESTARTDATE , #ENDDATETEMP=#BASEENDDATE
;WITH QUARTERS AS (
SELECT DATEADD(QUARTER,DATEDIFF(QUARTER,0,#STARTDATETEMP),0) AS DT,
DATEADD(DD, -1,DATEADD(QQ,DATEDIFF(QQ,0,#STARTDATETEMP)+1,0)) AS DATEEND
UNION ALL
SELECT DATEADD(QUARTER,1,DT),DATEADD(QUARTER,1,DATEEND) FROM QUARTERS
WHERE DT < DATEADD(QUARTER,DATEDIFF(QUARTER,0,#ENDDATETEMP),0)
)
INSERT INTO #QUARTERTEMP
SELECT 'Q' + DATENAME(QQ,DT) + '-' + CAST(RIGHT(YEAR(DT)+ 0,2) AS VARCHAR(50)),DT AS 'STARTDATE',DATEEND AS 'ENDDATE',ROW_NUMBER() OVER (ORDER BY DT)FROM QUARTERS
--SELECT * FROM #QUARTERTEMP
/*DECLARE LOCAL VARIABLES*/
DECLARE #QUARTERNAME AS VARCHAR(10)
DECLARE #BEGINDATE AS DATE
DECLARE #ENDDATE AS DATE
SET #COUNTERCOUNT = 1
SELECT #COUNTQUARTER = COUNT(*) FROM #QUARTERTEMP
DECLARE #RESPONSEVALUE AS DECIMAL(9,1)
DECLARE #COUNT AS INT
DECLARE #ALLAVG AS DECIMAL(9,2)
/*CREATE TEMP TABLE FOR INSERTING ALL RECORDS OF USERS*/
CREATE TABLE #TEMPUSER(USERID UNIQUEIDENTIFIER, USERNAME VARCHAR(100),[QUARTER] VARCHAR(40) NULL,[AVG] DECIMAL (9,2) NULL,[AVGALL] DECIMAL (9,2) NULL)
/*START OF WHILE LOOP*/
WHILE (#COUNTERCOUNT <= #COUNTQUARTER)
BEGIN
/*FETCH QUARTERS TABLE QUARTERWISE*/
SELECT #QUARTERNAME = [QUARTER],#BEGINDATE=STARTDATE,#ENDDATE = ENDDATE FROM #QUARTERTEMP WHERE COUNTROW = #COUNTERCOUNT
print(#BEGINDATE)
print(#ENDDATE)
IF #DEPTID IS NOT NULL
BEGIN
PRINT('IN DEPT')
/*DEPARTMENT AVG*/
CREATE TABLE #TEMPALLUSER(USERID UNIQUEIDENTIFIER, USERNAME VARCHAR(100),[QUARTER] VARCHAR(40) NULL,[AVG] DECIMAL (9,2) NULL,[AVGALL] DECIMAL (9,2) NULL)
SELECT #ALLAVG = ROUND(AVG(CAST(RESPONSEVALUE AS FLOAT)), 2) FROM SURVEYRESPONSES SR LEFT OUTER JOIN SURVEYS S
ON SR.SURVEYID = S.SURVEYID
LEFT OUTER JOIN SURVEYTARGETS ST ON S.SURVEYTARGETID = ST.SURVEYTARGETID
LEFT OUTER JOIN USERS U ON ST.IDENTIFICATION = U.USERID
INNER JOIN [DBO].[SURVEYDEFINITIONS] SD ON S.SURVEYDEFINITIONID=SD.SURVEYDEFINITIONID
INNER JOIN [DBO].[PARENTCHILDS] PC ON SD.SURVEYDEFINITIONTYPEID=PC.CHILDID
INNER JOIN [DBO].[MASTERQUESTIONS] M ON SR.MASTERQUESTIONID=M.MASTERQUESTIONID
INNER JOIN [DBO].[QUESTIONGROUPS] Q ON M.QUESTIONGROUPID=Q.QUESTIONGROUPID
--WHERE U.USERID IN (SELECT USERID FROM USERS WHERE USERS.PARENTUSERID = (SELECT TOP 1 PARENTUSERID FROM USERS WHERE USERS.IDENTIFICATION=#USERIDENTIFICATION))
WHERE U.USERID IN (SELECT USERID FROM USERS WHERE USERS.PARENTUSERID = #DEPTID)
AND (PC.PARENTID=#CASETYPEID OR PC.CHILDID=#CASETYPEID)
AND (1=CASE WHEN ((#GROUPTYPE= '-1') OR (Q.QUESTIONGROUPID=#GROUPTYPE)) THEN 1 ELSE 0 END)
AND SR.RESPONSEVALUE != -2147483648 AND S.SURVEYSTATUSID IN(6) AND S.SURVEYSTATUSID != 99
AND CAST(S.RESPONSEDATE AS DATE) BETWEEN #BEGINDATE AND #ENDDATE
/*INSERT VALUES IN TEMPALLUSER TABLE*/
INSERT INTO #TEMPALLUSER
SELECT U.USERID,U.NAME1,#QUARTERNAME,ROUND(AVG(CAST(RESPONSEVALUE AS FLOAT)), 2),#ALLAVG FROM SURVEYRESPONSES SR LEFT OUTER JOIN SURVEYS S
ON SR.SURVEYID = S.SURVEYID
LEFT OUTER JOIN SURVEYTARGETS ST ON S.SURVEYTARGETID = ST.SURVEYTARGETID
LEFT OUTER JOIN USERS U ON ST.IDENTIFICATION = U.USERID
INNER JOIN [DBO].[SURVEYDEFINITIONS] SD ON S.SURVEYDEFINITIONID=SD.SURVEYDEFINITIONID
INNER JOIN [DBO].[PARENTCHILDS] PC ON SD.SURVEYDEFINITIONTYPEID=PC.CHILDID
INNER JOIN [DBO].[MASTERQUESTIONS] M ON SR.MASTERQUESTIONID=M.MASTERQUESTIONID
INNER JOIN [DBO].[QUESTIONGROUPS] Q ON M.QUESTIONGROUPID=Q.QUESTIONGROUPID
--WHERE U.USERID IN (SELECT USERID FROM USERS WHERE USERS.PARENTUSERID = (SELECT TOP 1 PARENTUSERID FROM USERS WHERE USERS.IDENTIFICATION=#USERIDENTIFICATION))
WHERE U.USERID IN (SELECT USERID FROM USERS WHERE USERS.PARENTUSERID = #DEPTID) AND
(PC.PARENTID=#CASETYPEID OR PC.CHILDID=#CASETYPEID)
AND (1=CASE WHEN ((#GROUPTYPE= '-1') OR (Q.QUESTIONGROUPID=#GROUPTYPE)) THEN 1 ELSE 0 END)
AND SR.RESPONSEVALUE != -2147483648 AND S.SURVEYSTATUSID IN(6) AND S.SURVEYSTATUSID != 99
AND CAST(S.RESPONSEDATE AS DATE) BETWEEN #BEGINDATE AND #ENDDATE
GROUP BY U.USERID, U.NAME1
ORDER BY ROUND(AVG(CAST(RESPONSEVALUE AS FLOAT)), 2) DESC
INSERT INTO #TEMPUSER
SELECT * FROM #TEMPALLUSER
print(#COUNT)
SELECT #COUNT = COUNT(*) FROM #TEMPALLUSER
IF #COUNT = 0
BEGIN
INSERT INTO #TEMPUSER VALUES(NULL,'',#QUARTERNAME,0.0,0.0)
END
DROP TABLE #TEMPALLUSER
END /*END OF IF LOOP (DEPTID IS NOT NULL)*/
ELSE /*START OF ELSE CONDITION*/
BEGIN
PRINT('IN COMP')
/*COMPANY AVG*/
SELECT #ALLAVG = ROUND(AVG(CAST(RESPONSEVALUE AS FLOAT)), 2) FROM SURVEYRESPONSES SR LEFT OUTER JOIN SURVEYS S
ON SR.SURVEYID = S.SURVEYID
LEFT OUTER JOIN SURVEYTARGETS ST ON S.SURVEYTARGETID = ST.SURVEYTARGETID
LEFT OUTER JOIN USERS U ON ST.IDENTIFICATION = U.USERID
INNER JOIN [DBO].[SURVEYDEFINITIONS] SD ON S.SURVEYDEFINITIONID=SD.SURVEYDEFINITIONID
INNER JOIN [DBO].[PARENTCHILDS] PC ON SD.SURVEYDEFINITIONTYPEID=PC.CHILDID
INNER JOIN [DBO].[MASTERQUESTIONS] M ON SR.MASTERQUESTIONID=M.MASTERQUESTIONID
INNER JOIN [DBO].[QUESTIONGROUPS] Q ON M.QUESTIONGROUPID=Q.QUESTIONGROUPID
--WHERE (U.PARENTUSERID IN (SELECT USERID FROM USERS WHERE USERS.PARENTUSERID = (SELECT PARENTUSERID FROM USERS WHERE USERS.USERID= (SELECT TOP 1 PARENTUSERID FROM USERS WHERE USERS.IDENTIFICATION=#USERIDENTIFICATION))) OR
--U.PARENTUSERID = (SELECT PARENTUSERID FROM USERS WHERE USERS.USERID= (SELECT TOP 1 PARENTUSERID FROM USERS WHERE USERS.IDENTIFICATION=#USERIDENTIFICATION))) AND
WHERE ((U.USERID IN (SELECT USERID FROM USERS WHERE PARENTUSERID IN (SELECT USERID FROM USERS WHERE PARENTUSERID =#COMPANYID))
OR U.USERID IN (SELECT USERID FROM USERS WHERE PARENTUSERID=#COMPANYID))) AND
U.USERTYPEID = 3 AND (PC.PARENTID=#CASETYPEID OR PC.CHILDID=#CASETYPEID)
AND (1=CASE WHEN ((#GROUPTYPE= '-1') OR (Q.QUESTIONGROUPID=#GROUPTYPE)) THEN 1 ELSE 0 END)
AND SR.RESPONSEVALUE != -2147483648 AND S.SURVEYSTATUSID IN(6) AND S.SURVEYSTATUSID != 99
AND CAST(S.RESPONSEDATE AS DATE) BETWEEN #BEGINDATE AND #ENDDATE
/*INSERT VALUES IN TEMPALLUSER TABLE*/
INSERT INTO #TEMPALLUSER
SELECT U.USERID,U.NAME1,#QUARTERNAME,ROUND(AVG(CAST(RESPONSEVALUE AS FLOAT)), 2),#ALLAVG FROM SURVEYRESPONSES SR LEFT OUTER JOIN SURVEYS S
ON SR.SURVEYID = S.SURVEYID
LEFT OUTER JOIN SURVEYTARGETS ST ON S.SURVEYTARGETID = ST.SURVEYTARGETID
LEFT OUTER JOIN USERS U ON ST.IDENTIFICATION = U.USERID
INNER JOIN [DBO].[SURVEYDEFINITIONS] SD ON S.SURVEYDEFINITIONID=SD.SURVEYDEFINITIONID
INNER JOIN [DBO].[PARENTCHILDS] PC ON SD.SURVEYDEFINITIONTYPEID=PC.CHILDID
INNER JOIN [DBO].[MASTERQUESTIONS] M ON SR.MASTERQUESTIONID=M.MASTERQUESTIONID
INNER JOIN [DBO].[QUESTIONGROUPS] Q ON M.QUESTIONGROUPID=Q.QUESTIONGROUPID
--WHERE U.USERID IN (SELECT USERID FROM USERS WHERE USERS.PARENTUSERID = (SELECT TOP 1 PARENTUSERID FROM USERS WHERE USERS.IDENTIFICATION=#USERIDENTIFICATION))
WHERE((U.USERID IN (SELECT USERID FROM USERS WHERE PARENTUSERID IN (SELECT USERID FROM USERS WHERE PARENTUSERID =#COMPANYID))
OR U.USERID IN (SELECT USERID FROM USERS WHERE PARENTUSERID=#COMPANYID)))
AND (PC.PARENTID=#CASETYPEID OR PC.CHILDID=#CASETYPEID)
AND (1=CASE WHEN ((#GROUPTYPE= '-1') OR (Q.QUESTIONGROUPID=#GROUPTYPE)) THEN 1 ELSE 0 END)
AND SR.RESPONSEVALUE != -2147483648 AND S.SURVEYSTATUSID IN(6) AND S.SURVEYSTATUSID != 99
AND CAST(S.RESPONSEDATE AS DATE) BETWEEN #BEGINDATE AND #ENDDATE
GROUP BY U.USERID, U.NAME1
ORDER BY ROUND(AVG(CAST(RESPONSEVALUE AS FLOAT)), 2) DESC
SELECT #COUNT = COUNT(*) FROM #TEMPALLUSER
IF #COUNT = 0
BEGIN
INSERT INTO #TEMPALLUSER VALUES(NULL,'',#QUARTERNAME,0.0,0.0)
END
END /*END OF IF ELSE LOOP*/
SET #COUNTERCOUNT = #COUNTERCOUNT + 1
SET #BEGINDATE = '1900-01-01'
SET #ENDDATE = '1900-01-01'
END /*END WHILE LOOP */
/*FETCH DATA FROM TEMP TABLE*/
DECLARE #COLS AS NVARCHAR(MAX),
#QUERY AS NVARCHAR(MAX);
SELECT #COLS = STUFF((SELECT DISTINCT ',' + QUOTENAME(T.QUARTER)
FROM #TEMPUSER T
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET #QUERY = 'SELECT DISTINCT USERID,USERNAME,AVGALL, ' + #COLS + ' FROM
(
SELECT DISTINCT T.USERID
, T.USERNAME
,T.AVGALL
, T.QUARTER
, T.AVG
FROM #TEMPUSER T
) X
PIVOT
(
MIN(AVG)
FOR QUARTER IN (' + #COLS + ')
) P '
EXECUTE(#QUERY)
DROP TABLE #TEMPUSER
END
GO
In this image same username/userid rahul has avg in different quarters like in q1-14 and so on.. but in row 1 it has avg in q1-14, after that in row 2 avg is q2-14 and so on.. but i want remove null column and merge row 1/2/3 that has same user name but avg in different row, so i want it on single row.
so i want like this as below image:
You could just GROUP and SUM the rows of the resulting table:
SELECT USERID, USERNAME, MIN(AVGALL) as AVGALL,
SUM(Q1-14) as Q114, SUM(Q2-14) as Q214, SUNM(Q4-13) as Q413
FROM [TABLE]
GROUP BY USERID, USERNAME
To use with your query, you could push the results into a temp table. Just replace your call to EXECUTE(#QUERY) with the below:
-- select your results in to a temp table
SELECT INTO #T1 execute ('execute ' + #QUERY)
-- Perform the group and sum operations on the temp table to output results
SELECT USERID, USERNAME, MIN(AVGALL) as AVGALL,
SUM(Q1-14) as Q114, SUM(Q2-14) as Q214, SUNM(Q4-13) as Q413
FROM [#T1]
GROUP BY USERID, USERNAME

Need to insert a record if count = 0 else update the record

I need to write a query where i need to check the count record if count is 0, I am suppose to insert a record else update the record
If I do the same thing using cursor, it works fine but the same thing doesnt work with no cursor
Here is my query (with no cursor)
---Without cursor
INSERT INTO [dbo].Products_Del (product_Id, product_Del_startdate)
SELECT f.product_Id, min(cast(product_startdate as datetime)) AS orig_order_date FROM [dbo].Products f
inner join [dbo].Products_Del ac on f.product_Id = ac.product_Id
WHERE Product_Status = 'ORDERED'
AND product_startdate != '.'
AND (select COUNT(*) FROM products f1
INNER JOIN dbo.Products_Del ac on f1.product_Id = ac.product_Id
where f1.product_Id = f.product_Id) = 0
GROUP BY f.product_Id --order by product_Id
-- Update if exists
;with cts
AS (
SELECT product_Id , min(cast(product_startdate as datetime)) as orig_date from [dbo].Products f
WHERE product_Id in (select product_Id from Products_Del)
and Product_Status = 'ORDERED'
AND product_startdate != '.' -- ignore rows where date is unknown
AND (select COUNT(*) FROM Products f1
INNER JOIN dbo.Products_Del ac on f1.Product_id = ac.Product_id
where f1.product_Id = f.product_Id) = 1
GROUP BY product_Id
)
UPDATE ac
SET ac.product_Del_startdate = cts.orig_date
FROM Products_Del ac
INNER JOIN cts ON ac.product_Id = cts.product_Id
But this works good (with cursor)
DECLARE #v_count INT
DECLARE #c_product_id INT
DECLARE #c_product_date DATETIME
DECLARE cursor1 CURSOR FOR
SELECT product_id,
min(cast(product_startdate as DATETIME)) AS orig_order_date
FROM [dbo].Products
WHERE Product_Status = 'ORDERED'
AND product_startdate != '.' -- ignore rows where date is unknown
GROUP BY product_id
--order by product_id
OPEN cursor1
FETCH NEXT FROM cursor1 INTO #c_product_id,#c_product_date
WHILE(##FETCH_STATUS = 0)
BEGIN
SELECT #v_count = COUNT(*)
FROM [dbo].Products_Del
WHERE product_Id = #c_product_id
IF #v_count = 1
BEGIN
-- If so, plug the date into that row.
UPDATE [dbo].Products_Del
SET product_Del_startdate = #c_product_date
WHERE product_Id = #c_product_id
END
ELSE
BEGIN
-- If not, then create a new row in the aircraft_delivery_status table
IF #v_count = 0
BEGIN
INSERT INTO [dbo].Products_Del
(product_Id, product_Del_startdate)
VALUES (#c_product_id, #c_product_date)
END
END
FETCH NEXT FROM cursor1 INTO #c_product_id,#c_product_date
END
CLOSE cursor1
DEALLOCATE cursor1
SQL Fiddle link with schema
http://sqlfiddle.com/#!6/a7d0d/1
In the insert statement you have incorrect join
inner join [dbo].Products_Del ac on f.product_Id = ac.product_Id
just remove it
In the update statement (or ctp) you have incorrect condition :
(select COUNT(*) FROM Products f1
INNER JOIN dbo.Products_Del ac on f1.Product_id = ac.Product_id
where f1.product_Id = f.product_Id) =
1
because you have multiple rows with the same product_id in products table you can get more than one row in this subquery
Also I can suggest following query:
WITH OrderedProducts as(
SELECT p.product_id as product_id,
min(cast(product_startdate as datetime)) as start_date
FROM [dbo].[Products] as p
WHERE p.Product_Status = 'ORDERED'
AND p.Product_startdate != '.'
GROUP BY p.product_id
)
UPDATE pd
SET pd.product_Del_startdate = op.start_date
FROM Products_Del pd
INNER JOIN OrderedProducts as op ON pd.product_Id = op.product_Id
;WITH OrderedProducts as(
SELECT p.product_id as product_id,
min(cast(product_startdate as datetime)) as start_date
FROM [dbo].[Products] as p
WHERE p.Product_Status = 'ORDERED'
AND p.Product_startdate != '.'
GROUP BY p.product_id
)
INSERT INTO [dbo].Products_Del (product_Id, product_Del_startdate)
SELECT op.product_id, op.start_date FROM OrderedProducts as op
WHERE NOT EXISTS (
SELECT pd.product_id FROM [dbo].Products_Del as pd
WHERE pd.product_id = op.product_id )

Resources