Sql 使用pivot的分离组的聚合和?
我试图获得过去3天内每个分离组的累计金额。然而,我没有得到我所期望的。有谁能告诉我如何产生预期的输出,也许是使用pivot 但是,我的结果将这些组分开,当组为红色时给出结果,如果组为黄色,则返回null。但是,我希望得到这样的结果:即使组是黄色的,数据仍然不是空的,只是重复前面的数字。也许用pivot试试Sql 使用pivot的分离组的聚合和?,sql,oracle,Sql,Oracle,我试图获得过去3天内每个分离组的累计金额。然而,我没有得到我所期望的。有谁能告诉我如何产生预期的输出,也许是使用pivot 但是,我的结果将这些组分开,当组为红色时给出结果,如果组为黄色,则返回null。但是,我希望得到这样的结果:即使组是黄色的,数据仍然不是空的,只是重复前面的数字。也许用pivot试试 select *, case when group = 'Red' then count(NVL(amount,0)) OVER (PARTITION BY ACCOUNT, group OR
select *,
case when group = 'Red' then count(NVL(amount,0)) OVER (PARTITION BY ACCOUNT, group ORDER BY day_number range 2 PRECEDING),
case when group = 'Yellow' then count(NVL(amount,0)) OVER (PARTITION BY ACCOUNT, group ORDER BY day_number range 2 PRECEDING)
from table
预期产量
Account Group Sum day_number Red Yellow
abc Red 20 1 20 0
abc Red 30 3 50 0
abc Yellow 40 4 50 40
def Red 20 5 20 40
def Yellow 50 8 0 50
def Yellow 20 9 0 70
错误输出
Account Group Sum day_number Red Yellow
abc Red 20 1 20
abc Red 30 3 50
abc Yellow 40 4 40
def Red 20 5 20
def Yellow 50 8 50
def Yellow 20 9 70
我想你最想要的是
sum()
,而不是count()
:
我想你最想要的是
sum()
,而不是count()
:
如果您想使
红色
和黄色
列独立于帐户和组,只需删除分区(按
部分)
select t.*,
nvl(sum(case grp when 'Red' then amount end)
over (order by day_number range 2 preceding), 0) red,
nvl(sum(case grp when 'Yellow' then amount end)
over (order by day_number range 2 preceding), 0) yellow
from t
这给了我们一个结果:
ACCOUNT GRP AMOUNT DAY_NUMBER RED YELLOW
------- ------ ---------- ---------- ---------- ----------
abc Red 20 1 20 0
abc Red 30 3 50 0
abc Yellow 40 4 30 40
def Red 20 5 50 40
def Yellow 50 8 0 50
def Yellow 20 9 0 70
请注意,RED
列的第三行中存在差异(您键入50,查询显示30),但对于第4天,我们只有前两天的一个红色值,即30
如果您只需要重复空值,那么使用lag
,但这对我来说没有意义
您可以使用pivot
,但必须在子查询中正确准备数据,然后生成pivot。在这种情况下,语法更易读。如果要使红色
和黄色
列独立于帐户和组,只需删除按
部分划分的列即可
select t.*,
nvl(sum(case grp when 'Red' then amount end)
over (order by day_number range 2 preceding), 0) red,
nvl(sum(case grp when 'Yellow' then amount end)
over (order by day_number range 2 preceding), 0) yellow
from t
这给了我们一个结果:
ACCOUNT GRP AMOUNT DAY_NUMBER RED YELLOW
------- ------ ---------- ---------- ---------- ----------
abc Red 20 1 20 0
abc Red 30 3 50 0
abc Yellow 40 4 30 40
def Red 20 5 50 40
def Yellow 50 8 0 50
def Yellow 20 9 0 70
请注意,RED
列的第三行中存在差异(您键入50,查询显示30),但对于第4天,我们只有前两天的一个红色值,即30
如果您只需要重复空值,那么使用lag
,但这对我来说没有意义
您可以使用pivot
,但必须在子查询中正确准备数据,然后生成pivot。在本例中,case when
语法更具可读性。请发布您的其他代码以使其成为一个工作示例…首先请记住,使用else时您必须结束您的案例/end请发布您的其他代码以使其成为一个工作示例…首先请记住,使用else/endyes,sum时您必须结束您的案例。非常感谢。但是这段代码会给我上面显示的错误输出。组不是红色时缺少一些值。但是,我不希望丢失值,如果组不是红色,则显示与前一个相同的数字。@vicky。这是第二个条件中的一个输入错误。是的,求和。非常感谢。但是这段代码会给我上面显示的错误输出。组不是红色时缺少一些值。但是,我不希望丢失值,如果组不是红色,则显示与前一个相同的数字。@vicky。这是第二个条件中的一个输入错误。