【发布时间】:2012-03-04 21:34:04
【问题描述】:
这是我的基本查询
select distinct a.projects , case when(billing_fy!=0)
then(select round(((sum(cost_project)/(sum(billing_fy)/((10/12)*365)))),2)
from table1 b
where a.projects = b.projects
group by projects)
else 0 end as "WIP days outstanding"
from table1 a
它会产生以下输出
Projects WIP days outstanding
History - AURANGABAD - NASIK 0
History - PUNE - MUMBAI 0
History - NASIK - MUMBAI 89.92
History - SASAGRAM - MUMBAI 0
History - SASAGRAM - MUMBAI 1386.52
History - AURANGABAD - MUMBAI 83.25
现在我需要显示除第 4 行之外的所有行。我首先使用case语句的原因是因为如果我这样做了( billing_fy!=0 子句是为了防止除以0引起的错误)
select projects,
round(((sum(cost_project)/(sum(billing_fy)/((10/12)*365)))),2) as "WIP days outstanding"
from table1
where billing_fy!=0
group by projects;
我会得到
Projects WIP days outstanding
History - SASAGRAM - MUMBAI 1386.52
History - NASIK - MUMBAI 89.92
History - AURANGABAD - MUMBAI 83.25
但我还需要展示其他两个地方
History - AURANGABAD - NASIK 0
History - PUNE - MUMBAI 0
此查询只显示我不想要的行。
select distinct a.projects , case when(billing_fy!=0)
then(select round(((sum(cost_project)/(sum(billing_fy)/((10/12)*365)))),2) from table1 b where a.projects = b.projects group by projects)
else 0 end as "WIP days outstanding"
from table1 a
where (projects='History - SASAGRAM - MUMBAI' AND billing_fy=0);
并按预期给出输出
Projects WIP days outstanding
History - SASAGRAM - MUMBAI 0
现在是我的问题。 SQL中有没有办法否定WHERE子句?就像在 C++ 中一样,我只需要在子句前面使用 not 运算符来否定它。因为基本上,我想显示除上一行之外的所有行。
现在,我已经使用以下代码解决了显示除我不想要的行之外的所有行的问题
select distinct a.projects , case when(billing_fy!=0)
then(select round(((sum(cost_project)/(sum(billing_fy)/((10/12)*365)))),2) from table1 b where a.projects = b.projects group by projects)
else 0 end as "WIP days outstanding"
from table1 a
where projects not in ('History - SASAGRAM - MUMBAI') and billing_fy!=0
union all
select distinct a.projects , case when(billing_fy!=0)
then(select round(((sum(cost_project)/(sum(billing_fy)/((10/12)*365)))),2) from table1 b where a.projects = b.projects group by projects)
else 0 end as "WIP days outstanding"
from table1 a
where projects not in ('History - SASAGRAM - MUMBAI') and billing_fy=0
union all
select distinct a.projects , case when(billing_fy!=0)
then(select round(((sum(cost_project)/(sum(billing_fy)/((10/12)*365)))),2) from table1 b where a.projects = b.projects group by projects)
else 0 end as "WIP days outstanding"
from table1 a
where projects='History - SASAGRAM - MUMBAI' and billing_fy!=0;
这会产生所需的输出
Projects WIP days outstanding
History - NASIK - MUMBAI 89.92
History - AURANGABAD - MUMBAI 83.25
History - AURANGABAD - NASIK 0
History - PUNE - MUMBAI 0
History - SASAGRAM - MUMBAI 1386.52
这只是一种破旧的做法,我想知道是否可以否定 WHERE 子句,或者一些“更简洁”的替代方法来做我想做的事情。
谢谢!!
附:我使用 SQL Developer 和 Oracle 11g(以防万一有人问)
编辑按要求输入值
Projects Cost_Project Billing_FY
History - NASIK - MUMBAI 65696067.99 54937478.46
History - NASIK - MUMBAI 41385613.61 151909546.44
History - NASIK - MUMBAI 18029488.91 216353866.92
History - AURANGABAD - MUMBAI 33191393.23 57073935.95
History - AURANGABAD - MUMBAI 52681451.68 139055661.74
History - AURANGABAD - MUMBAI 74576522.31 390092578.24
History - PUNE - MUMBAI 0 0
History - PUNE - MUMBAI 0 0
History - PUNE - MUMBAI 0 0
History - SASAGRAM - MUMBAI 107540114.08 40653734.06
History - SASAGRAM - MUMBAI 209167760.1 28823862.66
History - SASAGRAM - MUMBAI 0 0
History - AURANGABAD - NASIK 0 0
History - AURANGABAD - NASIK 0 0
History - AURANGABAD - NASIK 0 0
【问题讨论】:
-
请显示您的示例输入数据。我不太明白你的问题,但听起来你可能想使用外连接而不是 "where x = y"
-
外连接不是用于两个单独的表吗?在任何情况下,查询都只是引用一个表(case 语句和 out 语句中的同一个表),我会将输入值编辑到问题的末尾
-
Oracle SQL 语法明确支持 NOT 运算符。 docs.oracle.com/cd/B19306_01/server.102/b14200/… 那么,为什么不试试呢?
-
“这只是一种简陋的做法”——旁观者认为简陋。愿意说出你为什么这么认为吗?
-
谢谢。这就是我一直在寻找的。我的第一次尝试是使用 !在不起作用的语句之前。
标签: sql oracle oracle11g oracle-sqldeveloper