У меня есть запрос, который проверяет статус конкретного танка, однако у меня есть 50 танков, которые я бы хотел выполнить это для (FV101, FV102, FV103 и т.д.)SQL Выполнить запрос несколько раз изменяя переменную
Я мог объединить 50 запросов с измененным WHERE, но я подозреваю, что должен быть лучший способ.
Запрос очень прост:
DECLARE @tank varchar(5)
SET @tank = 'FV101'
SELECT
ROW_NUMBER() OVER (PARTITION BY [Item] ORDER BY [TankName]) [Row],
*
FROM
(
SELECT TOP 1
@tank [TankName],
T1.[Item],
CASE WHEN AVG(CAST(T0.[pHValue] AS dec (10,5))) NOT BETWEEN MAX(T2. [pH_lower]) AND MAX(T2.[pH_upper]) THEN 'Red' ELSE 'Black' END [Spec]
FROM
t005_pci_data T0 INNER JOIN t001_fvbatch T1 ON T1.[FVBatch] = T0. [FVBatch] LEFT JOIN t024_specifications T2 ON T2.[BeerBrand] = T1.[BeerBrand] AND [Type] = 'Finished Product'
WHERE
T0.[FVBatch] = (SELECT TOP 1 T0.[FVBatch] FROM t005_pci_data T0 INNER JOIN t001_fvbatch T1 ON T1.[FVBatch] = T0.[FVBatch] WHERE T1.[TankName] = 'FV101' ORDER BY T0.[DateTime] DESC) AND
EXISTS (SELECT [FVBatch] FROM t005_pci_data WHERE [TankName] = @tank AND [DateTime] >= DATEADD(day,-2,GETDATE()))
GROUP BY
T1.[Item],T0.[DateTime]
ORDER BY
T0.[DateTime] DESC
) a
Есть ли способ, чтобы передать список значений для этого запроса для того, чтобы использовать вместо повторения запроса вручную несколько раз?
EDIT согласно предложению iamdave в
схемы (упрощенный), как показано ниже:
Цель состоит в том, чтобы перечислить все, что в настоящее время в каждом баке и проверить, если значение рН находится в допустимых пределах.
Желаемая выход (до FV105) будет:
В этом примере нет ничего в танках FV101 или FV104, в соответствии с решением следующего кода в WHERE
EXISTS (SELECT [FVBatch] FROM t005_pci_data WHERE [TankName] = @tank AND [DateTime] >= DATEADD(day,-2,GETDATE()))
Конечным результатом является создание таблицы в MSSRS, которая показывает, какой элемент находится в каждом резервуаре, и соответствует ли он спецификациям или нет.
ДАЛЕЕ EDIT с данными выборки по запросу (Не очень творческий Я боюсь)
declare @t1 table(FVBatch int, TankName nvarchar(5), Item nvarchar(20));
declare @t2 table(Item nvarchar(20), ph_lower decimal(10,2), ph_upper decimal(10,2));
declare @t3 table(FVBatch int, pHValue decimal(10,2), DateValue datetime);
insert into @t1 values
(3160001,'FV101','Stout')
,(3160002,'FV102','Stout')
,(3160003,'FV103','Stout')
,(3160004,'FV104','Pale Ale')
,(3160005,'FV105','Pale Ale')
,(3160070,'FST04','IPA');
insert into @t2 values
('Pale Ale',3.5,5.5)
,('Stout',2,3.5);
insert into @t3 values
(3160001,4 ,'20161209')
,(3160001,4 ,'20161210')
,(3160001,4 ,'20161212')
,(3160002,4 ,'20161218')
,(3160002,4 ,'20161220')
,(3160002,4 ,'20161222')
,(3160003,4 ,'20161218')
,(3160003,4 ,'20161220')
,(3160003,4 ,'20161222')
,(3160004,4 ,'20161209')
,(3160004,4 ,'20161210')
,(3160004,4 ,'20161212')
,(3160005,4 ,'20161218')
,(3160005,4 ,'20161220')
,(3160005,4 ,'20161222')
,(3160070,4.26,'20161218')
,(3160070,4.26,'20161216')
,(3160070,4.24,'20161215')
,(3160070,4.24,'20161214')
,(3160070,4.26,'20161213')
,(3160070,4.2 ,'20161212')
,(3160070,4.21,'20161211')
,(3160070,4.12,'20161209')
,(3160070,4.09,'20161208')
,(3160070,4.1 ,'20161207');
Ваш запрос выглядит слишком сложным, чтобы начать с, вы можете разместить ваш схема данных и желаемый результат? Вероятно, есть лучший способ сделать это, чем просто редактировать текущий запрос. – iamdave
Если у вас есть код, который вы хотите выполнить много раз с разными входными значениями, то хранимую процедуру или, возможно, функцию (в вашем случае, возможно, табличную функцию, поскольку вы хотите вернуть несколько столбцов). Однако я также согласен с [John Cobby] (http://stackoverflow.com/users/6478307/john-cobby) - ваш код выглядит так, как будто он может воспользоваться рефактором. Например, почему вы используете 'ROW_NUMBER()', когда выбранный подзапрос возвращает только одну строку? – 3N1GM4
Я отредактирую с предложениями iamdave, чтобы показать, почему коротко – coblenski