oracle减去然后除

时间:2016-10-27 14:59:41

标签: sql oracle

我需要帮助让这个工作。我简化了代码,但实际上我正在从3个不同的表中进行计数,需要对结果进行一些数学运算。具体来说,我需要获得2个结果并相互减去它们,然后将该答案除以另一个计数。

SELECT 
    (
        (
        SELECT 82 FROM DUAL
        ) * 100 

        /

        (select (
                    (
                    SELECT 100 as Test2 FROM DUAL
                            )
                    -
                    (
                    SELECT 50 as Test2 FROM DUAL
                            )
              ) from dual )               
    )
FROM DUAL;

如果我在第一个选择语句的最后一个括号之后将分区放在同一行和一个空格中,我就可以使用它,见下文。我将更快地测试一些。 - 工作:

SELECT 
    (
    SELECT 8200 FROM DUAL
    ) /
    (
      select (
                  (
                  SELECT 100 as Test2 FROM DUAL
                          )
                  -
                  (
                  SELECT 50 as Test2 FROM DUAL
                          )
            ) 
      from dual 
    )              

FROM DUAL;

2 个答案:

答案 0 :(得分:2)

The documentation for SQL*Plus说:

  

您可以通过以下三种方式之一结束SQL命令:

     
      
  • 用分号(;)
  •   
  • 单独使用斜线(/)
  •   
  • 有一个空行
  •   
     

...

     

一行上的斜杠(/)本身也告诉您希望的SQL * Plus   运行命令。按下最后一行末尾的Return键   命令。 SQL * Plus会提示您使用其他行号。键入斜杠   然后再次按Return键或单击“执行”。 SQL * Plus执行命令   并将其存储在缓冲区中。

该文档在很大程度上也适用于SQL Developer,但它始终表现为SQL * Plus与SQLBLANKLINES关闭。

在原始查询中,您可以将斜杠单独放在一行上;这不仅仅是因为它与前一个表达式位于不同的一行,而是与两者前一个表达式和下一个表达式不同。

当它作为脚本运行时,斜杠会导致前五行作为一个语句执行,这会生成错误“ORA-00907:缺少右括号”。然后剩余的11行作为单独的命令执行,生成“ORA-00933:SQL命令未正确结束”(对照该部分的第10行)。

正如您所见,您只需稍微重新排列布局,但您也可以稍微简化示例以删除一个额外的select ... from dual

SELECT ((SELECT 82 FROM DUAL) * 100)
  / ((SELECT 100 FROM DUAL) - (SELECT 50 FROM DUAL)) FROM DUAL;

您还可以将您的真实查询放入CTE(或内联视图)中,当您进行最终计算时可能会更清楚:

WITH t1 AS (SELECT 82 AS val FROM DUAL),
  t2 AS (SELECT 100 AS val FROM DUAL),
  t3 AS (SELECT 50 AS val FROM DUAL)
SELECT (t1.val * 100) / (t2.val - t3.val)
FROM t1
CROSS JOIN t2
CROSS JOIN t3;

(T1.VAL*100)/(T2.VAL-T3.VAL)
----------------------------
                         164

这假设每个子查询/ CTE返回一行,当然,但您现有的代码也需要这样做。

答案 1 :(得分:0)

我正在使用sql开发人员并且它出错了,因为我的分区符号与前一个值不同。我发布了正确格式化的代码,使其工作。感谢所有回复的人。