SQL Select 声明为变量
SQL Select statement as variable
所以我需要在另一个长select中多次使用从一个长select返回的数据。
我可以使用子查询,但我不想多次复制代码,因为我可能需要修改它。
所以我正在尝试做一些事情,比如声明一个临时视图或实现相同目的的事情:
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)
无需每次都重复第一个。
有什么想法吗?
首先声明动态 @sql
并为此设置查询。稍后将变量 @result
声明为 table 并为新创建的 table 传递 @sql
。你能不能这样。
的文档
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
您使用 CTE(通用 Table 表达式)执行此操作,它基本上是一个临时的 table,范围限定为单个查询。
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)
所以我需要在另一个长select中多次使用从一个长select返回的数据。
我可以使用子查询,但我不想多次复制代码,因为我可能需要修改它。
所以我正在尝试做一些事情,比如声明一个临时视图或实现相同目的的事情:
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)
无需每次都重复第一个。
有什么想法吗?
首先声明动态 @sql
并为此设置查询。稍后将变量 @result
声明为 table 并为新创建的 table 传递 @sql
。你能不能这样。
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
您使用 CTE(通用 Table 表达式)执行此操作,它基本上是一个临时的 table,范围限定为单个查询。
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)