Sql 在另一个语句中使用语句的结果
我有以下两条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
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