Hello I want to ask about how to simplify query in sql server,
my table look like this
DECLARE @startDate Date
SET @startDate = '2019-03-20'
declare @listOfDate table (
area varchar(20),
location varchar(50),
ipaddress varchar(20),
date datetime
)
declare @listOfData table(
area varchar(20),
location varchar(50),
ipaddress varchar(20),
T6 float, T5 float, T4 float, T3 float,
T2 float, T1 float, T0 float, H6 float,
H5 float, H4 float, H3 float, H2 float,
H1 float, H0 float
)
--insert the tables that you want to work with.
INSERT INTO @listOfDate SELECT area, location, ip, MAX(timerecord) FROM INF_Facility_Temperature Where
timerecord <= CONVERT(varchar(10), DATEADD(DAY, 6, @startDate), 120)
AND
timerecord >= @startDate
GROUP by area, Location, ip, CAST(timerecord as date)
--Cursor for iterating
declare @temperature cursor,
@timerecord datetime,
@area varchar(20),
@location varchar(50),
@ip varchar(20)
set @temperature = cursor for select * from @listOfDate
open @temperature
fetch next from @temperature into @area,@location, @ip, @timerecord
while(@@fetch_status = 0)
begin
IF EXISTS(SELECT area, location, ipaddress from @listOfData WHERE area=@area AND location=@location AND ipaddress = @ip)
BEGIN
UPDATE @listOfData SET
T1 = CASE
WHEN T1 = '0' THEN (SELECT (CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 1, @startDate), 120) THEN temp ELSE 0 END) AS 'T-1' FROM INF_Facility_Temperature where CONVERT(Varchar(30), timerecord, 120) = CONVERT(Varchar(30), @timerecord, 120)
AND
area= @area
AND
Location = @location
AND
ip = @ip
AND
timerecord <= CONVERT(varchar(10), DATEADD(DAY, 7, @startDate), 120))
ELSE T1 END
,
T2 = CASE
WHEN T2 = '0' THEN (SELECT (CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 2, @startDate), 120) THEN temp ELSE 0 END) AS 'T-2' FROM INF_Facility_Temperature where CONVERT(Varchar(30), timerecord, 120) = CONVERT(Varchar(30), @timerecord, 120)
AND
area= @area
AND
Location = @location
AND
ip = @ip
AND
timerecord <= CONVERT(varchar(10), DATEADD(DAY, 7, @startDate), 120))
ELSE T2 END
,
T3 = CASE
WHEN T3 = '0' THEN (SELECT (CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 3, @startDate), 120) THEN temp ELSE 0 END) AS 'T-2' FROM INF_Facility_Temperature where CONVERT(Varchar(30), timerecord, 120) = CONVERT(Varchar(30), @timerecord, 120)
AND
area= @area
AND
Location = @location
AND
ip = @ip
AND
timerecord <= CONVERT(varchar(10), DATEADD(DAY, 7, @startDate), 120))
ELSE T3 END ,
T4 = CASE
WHEN T4 = '0' THEN (SELECT (CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 4, @startDate), 120) THEN temp ELSE 0 END) AS 'T-2' FROM INF_Facility_Temperature where CONVERT(Varchar(30), timerecord, 120) = CONVERT(Varchar(30), @timerecord, 120)
AND
area= @area
AND
Location = @location
AND
ip = @ip
AND
timerecord <= CONVERT(varchar(10), DATEADD(DAY, 7, @startDate), 120))
ELSE T4 END
,
T5 = CASE
WHEN T5 = '0' THEN (SELECT (CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 5, @startDate), 120) THEN temp ELSE 0 END) AS 'T-2' FROM INF_Facility_Temperature where CONVERT(Varchar(30), timerecord, 120) = CONVERT(Varchar(30), @timerecord, 120)
AND
area= @area
AND
Location = @location
AND
ip = @ip
AND
timerecord <= CONVERT(varchar(10), DATEADD(DAY, 7, @startDate), 120))
ELSE T5 END ,
T6 = CASE
WHEN T6 = '0' THEN (SELECT (CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 6, @startDate), 120) THEN temp ELSE 0 END) AS 'T-2' FROM INF_Facility_Temperature where CONVERT(Varchar(30), timerecord, 120) = CONVERT(Varchar(30), @timerecord, 120)
AND
area= @area
AND
Location = @location
AND
ip = @ip
AND
timerecord <= CONVERT(varchar(10), DATEADD(DAY, 7, @startDate), 120))
ELSE T6 END ,
T0 = CASE
WHEN T0 = '0' THEN (SELECT (CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 0, @startDate), 120) THEN temp ELSE 0 END) AS 'T-2' FROM INF_Facility_Temperature where CONVERT(Varchar(30), timerecord, 120) = CONVERT(Varchar(30), @timerecord, 120)
AND
area= @area
AND
Location = @location
AND
ip = @ip
AND
timerecord <= CONVERT(varchar(10), DATEADD(DAY, 7, @startDate), 120))
ELSE T0 END,
H1 = CASE
WHEN H1 = '0' THEN (SELECT (CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 1, @startDate), 120) THEN humi ELSE 0 END) AS 'T-1' FROM INF_Facility_Temperature where CONVERT(Varchar(30), timerecord, 120) = CONVERT(Varchar(30), @timerecord, 120)
AND
area= @area
AND
Location = @location
AND
ip = @ip
AND
timerecord <= CONVERT(varchar(10), DATEADD(DAY, 7, @startDate), 120))
ELSE H1 END
,
H2 = CASE
WHEN H2 = '0' THEN (SELECT (CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 2, @startDate), 120) THEN humi ELSE 0 END) AS 'T-2' FROM INF_Facility_Temperature where CONVERT(Varchar(30), timerecord, 120) = CONVERT(Varchar(30), @timerecord, 120)
AND
area= @area
AND
Location = @location
AND
ip = @ip
AND
timerecord <= CONVERT(varchar(10), DATEADD(DAY, 7, @startDate), 120))
ELSE H2 END
,
H3 = CASE
WHEN H3 = '0' THEN (SELECT (CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 3, @startDate), 120) THEN humi ELSE 0 END) AS 'T-2' FROM INF_Facility_Temperature where CONVERT(Varchar(30), timerecord, 120) = CONVERT(Varchar(30), @timerecord, 120)
AND
area= @area
AND
Location = @location
AND
ip = @ip
AND
timerecord <= CONVERT(varchar(10), DATEADD(DAY, 7, @startDate), 120))
ELSE H3 END ,
H4 = CASE
WHEN H4 = '0' THEN (SELECT (CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 4, @startDate), 120) THEN humi ELSE 0 END) AS 'T-2' FROM INF_Facility_Temperature where CONVERT(Varchar(30), timerecord, 120) = CONVERT(Varchar(30), @timerecord, 120)
AND
area= @area
AND
Location = @location
AND
ip = @ip
AND
timerecord <= CONVERT(varchar(10), DATEADD(DAY, 7, @startDate), 120))
ELSE H4 END
,
H5 = CASE
WHEN H5 = '0' THEN (SELECT (CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 5, @startDate), 120) THEN humi ELSE 0 END) AS 'T-2' FROM INF_Facility_Temperature where CONVERT(Varchar(30), timerecord, 120) = CONVERT(Varchar(30), @timerecord, 120)
AND
area= @area
AND
Location = @location
AND
ip = @ip
AND
timerecord <= CONVERT(varchar(10), DATEADD(DAY, 7, @startDate), 120))
ELSE H5 END ,
H6 = CASE
WHEN H6 = '0' THEN (SELECT (CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 6, @startDate), 120) THEN humi ELSE 0 END) AS 'T-2' FROM INF_Facility_Temperature where CONVERT(Varchar(30), timerecord, 120) = CONVERT(Varchar(30), @timerecord, 120)
AND
area= @area
AND
Location = @location
AND
ip = @ip
AND
timerecord <= CONVERT(varchar(10), DATEADD(DAY, 7, @startDate), 120))
ELSE T6 END ,
H0 = CASE
WHEN H0 = '0' THEN (SELECT (CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 0, @startDate), 120) THEN humi ELSE 0 END) AS 'T-2' FROM INF_Facility_Temperature where CONVERT(Varchar(30), timerecord, 120) = CONVERT(Varchar(30), @timerecord, 120)
AND
area= @area
AND
Location = @location
AND
ip = @ip
AND
timerecord <= CONVERT(varchar(10), DATEADD(DAY, 7, @startDate), 120))
ELSE H0 END
WHERE area = @area AND location = @location AND ipaddress= @ip
END
ELSE
BEGIN
INSERT INTO @listOfData
SELECT area, location, ip,
(CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 6, @startDate), 120) THEN temp ELSE 0 END) AS 'T-6',
(CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 5, @startDate), 120) THEN temp ELSE 0 END) AS 'T-5',
(CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 4, @startDate), 120) THEN temp ELSE 0 END) AS 'T-4',
(CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 3, @startDate), 120) THEN temp ELSE 0 END) AS 'T-3',
(CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 2, @startDate), 120) THEN temp ELSE 0 END) AS 'T-2',
(CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 1, @startDate), 120) THEN temp ELSE 0 END) AS 'T-1',
(CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 0, @startDate), 120) THEN temp ELSE 0 END) AS 'T-0',
(CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 6, @startDate), 120) THEN humi ELSE 0 END) AS 'H-6',
(CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 5, @startDate), 120) THEN humi ELSE 0 END) AS 'H-5',
(CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 4, @startDate), 120) THEN humi ELSE 0 END) AS 'H-4',
(CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 3, @startDate), 120) THEN humi ELSE 0 END) AS 'H-3',
(CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 2, @startDate), 120) THEN humi ELSE 0 END) AS 'H-2',
(CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 1, @startDate), 120) THEN humi ELSE 0 END) AS 'H-1',
(CASE CONVERT(varchar(10),@timerecord, 120) WHEN CONVERT(varchar(10), DATEADD(DAY, 0, @startDate), 120) THEN humi ELSE 0 END) AS 'H-0'
from INF_Facility_Temperature where CONVERT(Varchar(30), timerecord, 120) = CONVERT(Varchar(30), @timerecord, 120)
AND
area= @area
AND
Location = @location
AND
ip = @ip
AND
timerecord <= CONVERT(varchar(10), DATEADD(DAY, 7, @startDate), 120)
END
fetch next from @temperature into @area, @location, @ip, @timerecord
END
SELECT * FROM @listOfData order by area, location
close @temperature
deallocate @temperature
the result should be like this:
actually its work perfecly, but its need a long time to execute. is there any way to get faster result?
in my current condition, i need more than 40seconds to finish execute this query
If anybody have a way, Please Tell me. Thank you