Поэтому мне нужно использовать данные, полученные из одного длинного выбора, несколько раз в другом.
Я мог бы использовать подзапросы, но я не хочу копировать код несколько раз, потому что мне может потребоваться его изменить.
Итак, я пытаюсь сделать что-то вроде объявления временного представления или чего-то, что достигает той же цели:
DECLARE @myView as view
SET @myView = (select ob.IdOrden, obs.idarticulo, a.descrip, obs.p1,cc.descrip, SUM(isnull(t.Minutos,0)) Minutos
from Ordenes_Bonos ob
left join (select SUM(DATEDIFF(MINUTE ,FechaIni,FechaFin)) Minutos,IdOrden, IdBono, IdEmpleado
from dbo.Pers_Tiempos_Bonos
group by IdOrden, IdBono, IdEmpleado) t on t.IdOrden = ob.IdOrden and t.IdBono = ob.IdBono
left join Ordenes_bonos_Salidas obs on obs.idorden = ob.idorden and obs.idbono = ob.IdBono
inner join Colores_cartas cc on cc.idcolor = obs.p1
inner join articulos a on a.idarticulo = obs.idarticulo
where ob.Descrip like 'prod%' and t.minutos > 5 and t.minutos < 1500
GROUP BY ob.IdOrden, obs.idarticulo, a.descrip, obs.p1, cc.descrip)
Но это не работает и, похоже, не разрешено. У меня нет разрешений на постоянный просмотр, так что это не вариант.
Я хочу этого, чтобы позже я мог выполнить другой запрос как:
declare @pp float
set @pp = .4
select @pp as factor, avg(cast(Minutos as float)) as TrimmedMeanP from @TestScores a
where (select count(*) from @myView aa where aa.Minutos <= a.Minutos) >= (select @pp*count(*) from @myView)
and (select count(*) from @myView bb where bb.Minutos >= a.Minutos) >= (select @pp*count(*) from @myView)
Без необходимости каждый раз повторять первую.
Любые идеи?
2 ответа
Вы делаете это с помощью CTE (Common Table Expression), это в основном временная таблица, область действия которой ограничена одним запросом.
declare @pp float
set @pp = .4
;with CTE as
(select
ob.IdOrden,
obs.idarticulo,
a.descrip,
obs.p1,cc.descrip,
SUM(isnull(t.Minutos,0)) Minutos
from
Ordenes_Bonos ob
left join
(select SUM(DATEDIFF(MINUTE ,FechaIni,FechaFin)) Minutos,IdOrden, IdBono, IdEmpleado
from dbo.Pers_Tiempos_Bonos
group by IdOrden, IdBono, IdEmpleado) t
on t.IdOrden = ob.IdOrden and t.IdBono = ob.IdBono
left join Ordenes_bonos_Salidas obs
on obs.idorden = ob.idorden
and obs.idbono = ob.IdBono
inner join Colores_cartas cc
on cc.idcolor = obs.p1
inner join articulos a
on a.idarticulo = obs.idarticulo
where
ob.Descrip like 'prod%'
and t.minutos > 5
and t.minutos < 1500
GROUP BY
ob.IdOrden,
obs.idarticulo,
a.descrip,
obs.p1,
cc.descrip)
select
@pp as factor,
avg(cast(Minutos as float)) as TrimmedMeanP
from @TestScores a
where
(select count(*) from CTE aa where aa.Minutos <= a.Minutos) >= (select @pp*count(*) from CTE)
and (select count(*) from CTE bb where bb.Minutos >= a.Minutos) >= (select @pp*count(*) from CTE)
Прежде всего объявите динамический @sql
и задайте для этого свой запрос. Позже объявите переменную @result
как таблицу и передайте @sql
для новой созданной таблицы. Вы могли бы что-то подобное.
Документация по sp_executesql
DECLARE @sql AS NVARCHAR(MAX)
SET @sql = (select ob.IdOrden, obs.idarticulo, a.descrip, obs.p1,cc.descrip, SUM(isnull(t.Minutos,0)) Minutos
from Ordenes_Bonos ob
left join (select SUM(DATEDIFF(MINUTE ,FechaIni,FechaFin)) Minutos,IdOrden, IdBono, IdEmpleado
from dbo.Pers_Tiempos_Bonos
group by IdOrden, IdBono, IdEmpleado) t on t.IdOrden = ob.IdOrden and t.IdBono = ob.IdBono
left join Ordenes_bonos_Salidas obs on obs.idorden = ob.idorden and obs.idbono = ob.IdBono
inner join Colores_cartas cc on cc.idcolor = obs.p1
inner join articulos a on a.idarticulo = obs.idarticulo
where ob.Descrip like 'prod%' and t.minutos > 5 and t.minutos < 1500
GROUP BY ob.IdOrden, obs.idarticulo, a.descrip, obs.p1, cc.descrip)
DECLARE @results AS TABLE
(
--table structure
)
INSERT INTO @results EXECUTE sp_executesql @sql
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.