Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在另一个语句中使用语句的结果_Sql - Fatal编程技术网

Sql 在另一个语句中使用语句的结果

Sql 在另一个语句中使用语句的结果,sql,Sql,我有以下两条SQL语句 select Fleet, SUM(hours) as Operating from table where colE = 'Operating' and START_TIME >= '2012-01-01' and END_TIME<='2013-01-01' and FLEET IS NOT NULL group by fleet order by FLEET asc selec

我有以下两条SQL语句

select 
    Fleet, SUM(hours) as Operating 
from 
    table
where 
    colE = 'Operating' 
    and START_TIME >= '2012-01-01' and END_TIME<='2013-01-01' 
    and FLEET IS NOT NULL
group by 
    fleet 
order by 
    FLEET asc


select Fleet, SUM(hours) as Delay
from table
    where colE='Delay'  and START_TIME>='2012-01-01' and END_TIME<='2013-01-01' and FLEET IS NOT NULL
        group by fleet order by FLEET asc  
有谁能帮我指引方向,如何做到这一点?sql新手,所以我认为应该使用临时表

谢谢

简单的内部联接应执行以下操作:

SELECT op.Fleet, (Operating / Delay) AS Calc FROM
(select 
    Fleet, SUM(hours) as Operating 
    from table
    where 
        colE = 'Operating' 
        and START_TIME >= '2012-01-01' and END_TIME<='2013-01-01' 
        and FLEET IS NOT NULL
    group by fleet 
) AS op INNER JOIN (
select Fleet, SUM(hours) as Delay
    from table
    where colE='Delay'  and START_TIME>='2012-01-01'
        and END_TIME<='2013-01-01' and FLEET IS NOT NULL
    group by fleet
) AS de ON op.Fleet = de.Fleet
ORDER BY op.Fleet ASC

这是更一般的,但在类似情况下可能会有所帮助

您可以像这样在声明的变量中选择值

Declare @X as Decimal, @Y as Decimal
Set @X = (Select [field] from [table] where [conditions])
Set @Y = (Select [field] from [table] where [conditions])

select @X / @Y
更具体地说,您可以使用案例陈述进行查询

SELECT
    Fleet
    ,SUM(CASE WHEN @colE = 'Operating' THEN hours END) 
    / SUM(CASE WHEN @colE = 'Delay' THEN hours END) as Calculated
FROM table
WHERE [conditions]

如果您的SQL引擎支持CTE的公共表表达式;e、 g.SQL SErver会,其他人也会,您可以使用以下内容:

;WITH BaseDataOperating AS 
(
select 
    Fleet, SUM(hours) as Operating 
from 
    table
where 
    colE = 'Operating' 
    and START_TIME >= '2012-01-01' and END_TIME<='2013-01-01' 
    and FLEET IS NOT NULL
group by 
    fleet 
), BaseDataDelay AS 
(
   select 
       Fleet, SUM(hours) as Delay
   from 
       table
   where 
       colE = 'Delay'
       and START_TIME >= '2012-01-01' and END_TIME <= '2013-01-01' 
       and FLEET IS NOT NULL
   group by 
       fleet 
)
SELECT 
   bdo.Fleet, 
   (bdo.Operating / bdd.Delay ) as Calculated_Col 
FROM
   BaseDataOperating bdo
INNER JOIN
   BaseDataDelay bdd ON bdo.Fleet = bdd.Fleet

基本上,为运行编号创建一个CTE,为延迟编号创建一个CTE,然后从这两个CTE的内部联接中进行选择最简单的方法是联接两个结果:

select a.Fleet, (Operating / Delay ) as Calculated_Col
from (select Fleet, SUM(hours) as Operating 
      from table
      where colE = 'Operating' 
      and START_TIME >= '2012-01-01'
      and END_TIME<='2013-01-01' 
      and FLEET IS NOT NULL
      group by fleet) a
join (select Fleet, SUM(hours) as Delay
      from table
      where colE='Delay'
      and START_TIME>='2012-01-01'
      and END_TIME<='2013-01-01'
      and FLEET IS NOT NULL
      group by fleet) b 
      on a.fleet = b.fleet
order by a.FLEET asc  

这是如何进行所要求的计算的?@Bohemian:重新阅读这个问题,我误解了。我没有看到被部分分割的部分。我已经更新了我的答案。谢谢大家,它对结果非常有效,就我所知,如果我想在混合中添加一个额外的变量statment,我会简单地添加另一个内部联接吗?我认为联接的效率比你需要的要低。您也可以通过案例陈述来实现这一点。其他人会知道得更好,但我认为db上的工作可能会更少。现在我再次查看,我开始认为CASE语句将更容易做到这一点。感谢Bohemian,如果我想在混合中添加第三个结果,我会添加另一个连接吗?例如,选择a.车队,运行/延迟1+延迟2作为计算结果\u谢谢!通过添加更多联接,我增加了额外的5个stations,并将on逻辑保留到第一个运行的舰队中。Sam,很高兴这能起作用,但请看一下使用case语句而不是多个联接。在大桌子上,您可能会看到性能上的差异。
select a.Fleet, (Operating / Delay ) as Calculated_Col
from (select Fleet, SUM(hours) as Operating 
      from table
      where colE = 'Operating' 
      and START_TIME >= '2012-01-01'
      and END_TIME<='2013-01-01' 
      and FLEET IS NOT NULL
      group by fleet) a
join (select Fleet, SUM(hours) as Delay
      from table
      where colE='Delay'
      and START_TIME>='2012-01-01'
      and END_TIME<='2013-01-01'
      and FLEET IS NOT NULL
      group by fleet) b 
      on a.fleet = b.fleet
order by a.FLEET asc