Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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 - Fatal编程技术网

Sql 计算查询中正值的数目

Sql 计算查询中正值的数目,sql,oracle,Sql,Oracle,我正在处理以下查询和表 SELECT dd.actual_date, dd.week_number_overall, sf.branch_id, AVG(sf.overtarget_qnt) AS targetreach FROM sales_fact sf, date_dim dd WHERE dd.date_id = sf.date_id AND dd.week_number_overall BETWEEN 88-2 AND 88 AND sf.branch_id = 1 GROUP BY

我正在处理以下查询和表

SELECT dd.actual_date, dd.week_number_overall, sf.branch_id, AVG(sf.overtarget_qnt) AS targetreach
FROM sales_fact sf, date_dim dd 
WHERE dd.date_id = sf.date_id
AND dd.week_number_overall BETWEEN 88-2 AND 88
AND sf.branch_id = 1
GROUP BY dd.actual_date, branch_id, dd.week_number_overall
ORDER BY dd.actual_date ASC;

ACTUAL_DATE WEEK_NUMBER_OVERALL  BRANCH_ID TARGETREACH
----------- ------------------- ---------- -----------
13/08/14                     86          1         -11 
14/08/14                     86          1          12 
15/08/14                     86          1        11.8 
16/08/14                     86          1         1.4 
17/08/14                     86          1        -0.2 
19/08/14                     86          1         7.2 
20/08/14                     87          1        16.6 
21/08/14                     87          1        -1.4 
22/08/14                     87          1        14.4 
23/08/14                     87          1         2.8 
24/08/14                     87          1          18 
26/08/14                     87          1        13.4 
27/08/14                     88          1        -1.8 
28/08/14                     88          1        10.6 
29/08/14                     88          1         7.2 
30/08/14                     88          1          14 
31/08/14                     88          1         9.6 
02/09/14                     88          1        -3.2 
“TargetTorEach”列显示是否已到达目标。 负值表示当天未达到目标。 如何获取并计算此查询的正值行数

这将显示如下内容:

TOTAL_POSITIVE_TARGET_REACH WEEK_NUMBER_OVERALL
--------------------------- ------------------
13                          88
我已经尝试使用这个用例,但仍然不能正常工作。
非常感谢。

您想使用条件聚合:

SELECT WEEK_NUMBER_OVERALL, COUNT(*) TOTAL_POSITIVE_TARGET_REACH
FROM (your original query)
WHERE TARGETREACH >= 0
GROUP BY WEEK_NUMBER_OVERALL
with t as (
      <your query here>
     )
select week_number_overall, sum(case when targetreach > 0 then 1 else 0 end)
from t
group by week_number_overall;

CTE(第一个解决方案)和子查询之间的差异(在本例中)只是偏好的问题。

您想使用条件聚合:

with t as (
      <your query here>
     )
select week_number_overall, sum(case when targetreach > 0 then 1 else 0 end)
from t
group by week_number_overall;
select sum( decode( sign( TARGETREACH ) , -1 , 0 , 0 , 0 , 1 , 1 ) ) from ( "your query here" ); CTE(第一个解决方案)和子查询之间的区别(在本例中)只是偏好的问题

select sum( decode( sign( TARGETREACH ) , -1 , 0 , 0 , 0 , 1 , 1 ) ) from ( "your query here" ); 选择和(解码(符号(targetRach),-1,0,0,1,1)) 来自(“您的查询在此”); 选择和(解码(符号(targetRach),-1,0,0,1,1)) 来自(“您的查询在此”);
使用
HAVING
子句

SELECT dd.actual_date, dd.week_number_overall, sf.branch_id, AVG(sf.overtarget_qnt) AS targetreach
FROM sales_fact sf, date_dim dd 
WHERE dd.date_id = sf.date_id
AND dd.week_number_overall BETWEEN 88-2 AND 88
AND sf.branch_id = 1
GROUP BY dd.actual_date, branch_id, dd.week_number_overall
HAVING AVG(sf.overtarget_qnt)>0
ORDER BY dd.actual_date ASC;

使用
HAVING
子句

SELECT dd.actual_date, dd.week_number_overall, sf.branch_id, AVG(sf.overtarget_qnt) AS targetreach
FROM sales_fact sf, date_dim dd 
WHERE dd.date_id = sf.date_id
AND dd.week_number_overall BETWEEN 88-2 AND 88
AND sf.branch_id = 1
GROUP BY dd.actual_date, branch_id, dd.week_number_overall
HAVING AVG(sf.overtarget_qnt)>0
ORDER BY dd.actual_date ASC;
使用decode(),sign()可以同时获得正计数和负计数

drop table test;

create table test (
key number(5),
value number(5));

insert into test values ( 1, -9 );
insert into test values ( 2, -8 );

insert into test values ( 3, 10 );
insert into test values ( 4, 12 );

insert into test values ( 5, -9 );
insert into test values ( 6, 8 );
insert into test values ( 7, 51 );

commit;

select sig , count ( sig ) from
(
select key,  ( (decode( sign( value ) , -1 , '-ve' , 0 , 'zero' , 1 , '+ve' ) ) ) sig
from test 
)
group by sig



SIG  COUNT(SIG)             
---- ---------------------- 
+ve  4                      
-ve  3                      
使用decode(),sign()可以同时获得正计数和负计数

drop table test;

create table test (
key number(5),
value number(5));

insert into test values ( 1, -9 );
insert into test values ( 2, -8 );

insert into test values ( 3, 10 );
insert into test values ( 4, 12 );

insert into test values ( 5, -9 );
insert into test values ( 6, 8 );
insert into test values ( 7, 51 );

commit;

select sig , count ( sig ) from
(
select key,  ( (decode( sign( value ) , -1 , '-ve' , 0 , 'zero' , 1 , '+ve' ) ) ) sig
from test 
)
group by sig



SIG  COUNT(SIG)             
---- ---------------------- 
+ve  4                      
-ve  3                      

只是想澄清一下,您希望在所有三周内得到一个值,与最近一周相比;不是每周单独计数吗?只是澄清一下,您希望在所有三周内,相对于最近一周,有一个单一的值;不是每周单独清点吗?还不完全清楚,但我认为OP想要一个单一的数字;因此,
max(周数),count(*)
没有
分组依据
?这并不完全清楚,但我认为OP想要一个数字;所以
max(周数),count(*),不使用
groupby
?使用CTE和子查询时是否存在性能问题?哪一个更好?@RGS。我相信在Oracle中,子查询和CTE应该产生基本相同的执行计划,但您应该检查您的特定查询。并非所有数据库都是如此。CTE比子查询更灵活;我两者都用。谢谢@Gordon的宝贵反馈。我向前迈出了一步:当我们使用CTE和sub query时,是否存在任何性能问题?哪一个更好?@RGS。我相信在Oracle中,子查询和CTE应该产生基本相同的执行计划,但您应该检查您的特定查询。并非所有数据库都是如此。CTE比子查询更灵活;我两者都用。谢谢@Gordon的宝贵反馈。我向前迈出了一步: