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 )