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_Oracle_Expression - Fatal编程技术网

Sql 等式查询

Sql 等式查询,sql,oracle,expression,Sql,Oracle,Expression,我有3个查询返回3个值。我想加入查询以执行以下表达式: (MgO + CaO)/SiO2 我该怎么做 氧化镁: 曹: 二氧化硅: 您可以使用row_number函数代替rownum,然后为3个元素选择结果 这篇评论有点长 您问题中的查询可能没有达到您预期的效果。Oracle计算order by之前的WHERE子句。因此,下面使用MgO选择任意一行,然后按日期对该行进行简单排序: SELECT sampled_date, result FROM AF_VW WHERE element = 'M

我有3个查询返回3个值。我想加入查询以执行以下表达式:

(MgO + CaO)/SiO2
我该怎么做

氧化镁:

曹:

二氧化硅:


您可以使用row_number函数代替rownum,然后为3个元素选择结果

这篇评论有点长

您问题中的查询可能没有达到您预期的效果。Oracle计算order by之前的WHERE子句。因此,下面使用MgO选择任意一行,然后按日期对该行进行简单排序:

SELECT sampled_date, result 
FROM AF_VW
WHERE element = 'MgO' AND ROWNUM = 1
ORDER BY sampled_date DESC;
实际上,为了得到相同的结果,您需要模拟相同的、不稳定的逻辑。不稳定,因为如果查询运行多次,结果不一定相同:

with mg as (
          SELECT sampled_date, result 
          FROM AF_VW
          WHERE element = 'MgO' AND ROWNUM = 1
         ),
     coa as (
          SELECT sampled_date, result 
          FROM AF_VW
          WHERE element = 'CaO' AND ROWNUM = 1
         ),
     sio2 as (
          SELECT sampled_date, result 
          FROM AF_VW
          WHERE element = 'SiO2' AND ROWNUM = 1
     )
select (mgo.result + cao.result) / sio2.result
from mgo cross join cao cross join sio2;

我怀疑您真的想要最新的样本日期,这就是VKP的答案所提供的。我只是认为您应该知道,您当前的查询并不是这样做的。

您用Oracle标记了这个问题,但标题提到了SQL Server—您使用的是哪个数据库?我猜Oracle是基于语法的。仅供参考:在这三个示例查询中,orderby基本上没有意义。ROWNUM=1条件在对行进行排序之前进行计算,因此您将获得任意行,然后自行对其进行排序。如果您想要包含最新日期的行,您可以a使用稠密的秩函数,b使用vkp答案中的分析函数,或c使用嵌套子查询结构,内部查询中使用ORDER BY,外部查询中使用ROWNUM条件。您的问题是您的查询返回3个值。如果是这样,请使用类似的语法:从双精度中选择7+从双精度中选择4/从双精度中选择5。将括号中的查询替换为语句,然后选择result from dual。
SELECT sampled_date, result 
FROM AF_VW WHERE element = 'SiO2' AND ROWNUM = 1 ORDER BY sampled_date DESC;
with x as (
SELECT sampled_date, result, element,
row_number() over(partition by element order by sampled_date desc) rn 
FROM AF_VW)
, y as (
select 
case when element = 'MgO' then result end as MGO,
case when element = 'CaO' then result end as CaO,
case when element = 'SiO2' then result end as SiO2
FROM x where rn = 1)
select (mgo+cao)/sio2 from y; 
SELECT sampled_date, result 
FROM AF_VW
WHERE element = 'MgO' AND ROWNUM = 1
ORDER BY sampled_date DESC;
with mg as (
          SELECT sampled_date, result 
          FROM AF_VW
          WHERE element = 'MgO' AND ROWNUM = 1
         ),
     coa as (
          SELECT sampled_date, result 
          FROM AF_VW
          WHERE element = 'CaO' AND ROWNUM = 1
         ),
     sio2 as (
          SELECT sampled_date, result 
          FROM AF_VW
          WHERE element = 'SiO2' AND ROWNUM = 1
     )
select (mgo.result + cao.result) / sio2.result
from mgo cross join cao cross join sio2;