Sql 通过更改(按分区)结果集上的计数()进行排序
我试图统计在某些地点每天发生的一些交易类型。例如,如果我有两种不同类型的交易x,y和一个日期和一个地点(NY),我试图查看该日期和该地点发生了多少x交易,发生了多少y交易,以及总计。看起来不错,但是当我使用order by date desc时,结果会发生变化,相同日期的所有位置都有相同的计数。有人能解释一下为什么会发生这种事吗。 对于不同的地点和相同的日期,我得到了相同的计数 我使用了下面的逻辑Sql 通过更改(按分区)结果集上的计数()进行排序,sql,oracle,Sql,Oracle,我试图统计在某些地点每天发生的一些交易类型。例如,如果我有两种不同类型的交易x,y和一个日期和一个地点(NY),我试图查看该日期和该地点发生了多少x交易,发生了多少y交易,以及总计。看起来不错,但是当我使用order by date desc时,结果会发生变化,相同日期的所有位置都有相同的计数。有人能解释一下为什么会发生这种事吗。 对于不同的地点和相同的日期,我得到了相同的计数 我使用了下面的逻辑 select location, trunc(date), count(locati
select location, trunc(date),
count(location) over (partition by date) as grand_total
from table
where transaction_types in (x,y)
ORDER BY DATE DESC
预期结果应为:
locaton date grandtotal
NY 1/1/2019 5
NJ 1/1/2019 7
实际的
LOCATION DATE GRANDTOTAL
NY 1/1/2019 5
NJ 1/1/2019 5
对于不同的位置和相同的日期,我得到的计数是相同的。只需在分区中添加位置,因为您希望每个位置都有datewise,而不仅仅是datewise,因此分区应该使用包含日期的位置
select location, trunc(date),
count(location)
over (partition by location, date) as
grand_total
from table where transaction_types in
(x,y)
ORDER BY DATE DESC
我认为以下使用
groupby
和条件aggregate
函数的查询将解决您的问题:
select location,
trunc(date),
Sum(case when transaction_types = 'x' then 1 end) as x_total,
Sum(case when transaction_types = 'y' then 1 end) as y_total,
count(1) as total
from table where transaction_types in (x,y)
group by location,trunc(date);
干杯 发布一些源数据会有帮助。如果按日期划分
,则无论外部查询中的任何顺序,每个日期都应得到相同的结果。我的猜测是,如果您在查询中实际需要一个分析函数,而不是一个带有groupby
的聚合函数,那么您需要count(*)over(按位置划分)
。如果您需要TRUNC(DATE),这意味着DATE(列的可怕名称,因为它是Oracle中数据类型的名称)具有时间组件。如果要计算给定日期的所有事务,则应按TRUNC(日期)划分,而不是按日期划分。然后:如果你想按地点计算交易,为什么要计算地点?位置应与TRUNC(日期)一起位于分区中。计数应为事务数,并以事务类型为条件:count(当事务类型='x'然后1结束时的情况)超过…..
I将nvl添加到各个事务计数中,在没有事务的情况下放入0,并留空。再次感谢。如果location
也包含空值,则结果将不同。