Поэтому мне нужно использовать данные, полученные из одного длинного выбора, несколько раз в другом.

Я мог бы использовать подзапросы, но я не хочу копировать код несколько раз, потому что мне может потребоваться его изменить.

Итак, я пытаюсь сделать что-то вроде объявления временного представления или чего-то, что достигает той же цели:

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)

Без необходимости каждый раз повторять первую.

Любые идеи?

0
Pinx0 10 Мар 2015 в 13:02

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)
1
G B 10 Мар 2015 в 10:22

Прежде всего объявите динамический @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
0
Stanislovas Kalašnikovas 10 Мар 2015 в 10:15