Как передать объявленное значение в псевдоним имени временного столбца при использовании хранимой процедуры? - PullRequest
0 голосов
/ 08 ноября 2019

При расчете ставок на разных сайтах мы всегда используем разные названия мест и т. Д. Поэтому я хочу создать хранимую процедуру, поэтому, когда я нахожусь на определенных сайтах, когда я запускаю хранимую процедуру, я могу объявить эти значения вместо того, чтобы все время проходить через сценарий и вносить изменения значения. Мне удалось создать процедуру и объявить значения для поиска, однако я не могу передать это объявленное значение в псевдоним имени столбца создаваемой временной таблицы.

DECLARE @TimePeriod as INT = '15'
Declare @LocID1 as varchar(max) = 'IN02'
Declare @LocID2 as varchar(max) = 'IN03'
Declare @LocID3 as varchar(max) = 'PL01'
Declare @GroupLocID1 as varchar(max) = 'IN%'
Declare @GroupLocID2 as varchar(max) = 'PL%'
Declare @GroupLocID3 as varchar(max) = 'IN9%'

--Create Procedure ThroughputTest 
--@TimePeriod INT, 
--@LocID1 varchar(max),
--@LocID2 varchar(max),
--@LocID3 varchar(max),
--@GroupLocID1 varchar(max), 
--@GroupLocID2 varchar(max), 
--@GroupLocID3 varchar(max) 

--AS

SELECT temp.starttime, temp.endtime,
      cast(SUM(CASE WHEN lc.Loc1 = @LocID1 THEN 1.00 ELSE 0.00 END)/@TimePeriod as decimal(18,2))
    + cast(SUM(CASE WHEN lc.Loc2 = @LocID1 THEN 1.00 ELSE 0.00 END)/@TimePeriod as decimal(18,2))
    + cast(SUM(CASE WHEN lc.Loc3 = @LocID1 THEN 1.00 ELSE 0.00 END) /@TimePeriod as decimal(18,2))
        AS LocID1, 
      cast(SUM(CASE WHEN lc.Loc1 = @LocID2 THEN 1.00 ELSE 0.00 END)/@TimePeriod as decimal(18,2))
    + cast(SUM(CASE WHEN lc.Loc2 = @LocID2 THEN 1.00 ELSE 0.00 END)/@TimePeriod as decimal(18,2))
    + cast(SUM(CASE WHEN lc.Loc3 = @LocID2 THEN 1.00 ELSE 0.00 END) /@TimePeriod as decimal(18,2))
        AS LocID2, 
      cast(SUM(CASE WHEN lc.Loc1 = @LocID3 THEN 1.00 ELSE 0.00 END)/@TimePeriod as decimal(18,2))
    + cast(SUM(CASE WHEN lc.Loc2 = @LocID3 THEN 1.00 ELSE 0.00 END)/@TimePeriod as decimal(18,2))
    + cast(SUM(CASE WHEN lc.Loc3 = @LocID3 THEN 1.00 ELSE 0.00 END) /@TimePeriod as decimal(18,2))
        AS LocID3, 
      cast(SUM(CASE WHEN lc.Loc1 LIKE @GroupLocID1 THEN 1.00 ELSE 0.00 END)/@TimePeriod as decimal(18,2))
    + cast(SUM(CASE WHEN lc.Loc2 LIKE @GroupLocID1 THEN 1.00 ELSE 0.00 END)/@TimePeriod as decimal(18,2))
    + cast(SUM(CASE WHEN lc.Loc3 LIKE @GroupLocID1 THEN 1.00 ELSE 0.00 END)/@TimePeriod as decimal(18,2))
        AS GroupLocID1,
      cast(SUM(CASE WHEN lc.Loc1 LIKE @GroupLocID2 THEN 1.00 ELSE 0.00 END)/@TimePeriod as decimal(18,2))
    + cast(SUM(CASE WHEN lc.Loc2 LIKE @GroupLocID2 THEN 1.00 ELSE 0.00 END)/@TimePeriod as decimal(18,2))
    + cast(SUM(CASE WHEN lc.Loc3 LIKE @GroupLocID2 THEN 1.00 ELSE 0.00 END)/@TimePeriod as decimal(18,2))
        AS GroupLocID2,
      cast(SUM(CASE WHEN lc.Loc1 LIKE @GroupLocID3 THEN 1.00 ELSE 0.00 END)/@TimePeriod as decimal(18,2))
    + cast(SUM(CASE WHEN lc.Loc2 LIKE @GroupLocID3 THEN 1.00 ELSE 0.00 END)/@TimePeriod as decimal(18,2))
    + cast(SUM(CASE WHEN lc.Loc3 LIKE @GroupLocID3 THEN 1.00 ELSE 0.00 END)/@TimePeriod as decimal(18,2))
        AS GroupLocID3
    FROM (
        SELECT CAST(FORMAT(time_orig, 'yyyy-MM-dd HH:mm:00') AS DATETIME) AS starttime
            ,CAST(FORMAT(DATEADD(MINUTE, @TimePeriod, time_orig), 'yyyy-MM-dd HH:mm:00') AS DATETIME) AS endtime
        FROM dbo.ThroughPut
        WHERE time_orig  <= getdate()-(1/24/4)
        GROUP BY
            CAST(FORMAT(time_orig, 'yyyy-MM-dd HH:mm:00') AS DATETIME),
            CAST(FORMAT(DATEADD(MINUTE, @TimePeriod, time_orig), 'yyyy-MM-dd HH:mm:00') AS DATETIME)
    ) temp
    INNER JOIN dbo.Throughput lc ON lc.Time_Orig BETWEEN temp.starttime AND temp.endtime
GROUP BY starttime, endtime
ORDER BY starttime, endtime

--Exec ThroughputTest 
--@TimePeriod = '15',
--@LocID1 = 'IN02',
--@LocID2 = 'IN03',
--@LocID3 = 'PL01',
--@GroupLocID1 = 'IN%',
--@GroupLocID2 = 'PL%',
--@GroupLocID3 = 'IN9%'

Как только это будет сделанозатем я посмотрю на получение кода для зацикливания, поскольку вычисляемые местоположения могут быть в диапазоне от 1 до X, но когда я доберусь до этого, выясню эту часть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...