例如,假设我有一个包含列的表:
item_id opp date
此表是在特定日期应用于它们的items_ids和操作的存档。 我想查询表并计算OPP为'FOO'的项目数量,这些项目在日期内也有OPP'BAZ'的条目。
count(rowid) from table_name where OPP='FOO' and date='01012011'
此查询将为我提供第一部分,是否有一种智能方法可以链接两者而无需以一般形式执行另一个内联选择:
count(rowid) from table_name
where OPP='FOO'
and date='01012011'
and item_id in (
select item_id from table_name where date='01012011'
)
该平台是Oracle 10G,我正在使用Toad进行开发,但希望能够获取sql代码并通过Perl DBI运行,所以常规sql,而不是pl / sql。
答案 0 :(得分:1)
您可以使用相关子查询验证另一行是否存在具有不同OPP值的行,如下例所示(假设想要第二行具有不同的状态 - 可以轻松更改以查找状态BAZ。
select count(rowid)
from table_name outr
where OPP='FOO'
and date='01012011'
and exists (select null
from table_name innr
where innr.OPP = 'BAZ'
and innr.date = outr.date)
这是完全有效的SQL,而不是PL / SQL。
答案 1 :(得分:0)
不是特别聪明,但我认为你可以使用这样的自联接来实现:
select a.date,count(*)
from table_name a, table_name b
where a.date = '01012011'
and a.date = b.date
and a.OPP = 'FOO'
and b.OPP <> 'FOO'
答案 2 :(得分:0)
您可以使用CONNECT BY PRIOR(http://psoug.org/reference/connectby.html更多信息)
一个小例子(d是我的日期栏)。当然,您可以对查询进行计数,但我发现在没有计数的情况下更容易验证您想要的内容。
create table gregws(
item_id varchar2(200),
opp varchar2(200),
d varchar2(200)
);
insert into gregws (item_id,opp,d) values ('AA','FOO','100');
insert into gregws (item_id,opp,d) values ('AB','BOO','100');
insert into gregws (item_id,opp,d) values ('AC','FOO','300');
insert into gregws (item_id,opp,d) values ('AD','MOO','300');
insert into gregws (item_id,opp,d) values ('AE','ZOO','200');
select distinct * from gregws
start with opp='FOO'
connect by nocycle prior d = d and prior opp != opp;
答案 3 :(得分:0)
我认为这会给你你想要的东西:对于给定日期,item_ID具有“FOO”和“BAZ”的OPP的唯一item_ID的数量的计数。
SELECT COUNT(DISTINCT item_id)
FROM table_name
WHERE opp IN ('FOO', 'BAZ') AND date = '01012011'
HAVING COUNT(DISTINCT opp) = 2