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的宝贵反馈。我向前迈出了一步: