Sql 使用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

我试图获得过去3天内每个分离组的累计金额。然而,我没有得到我所期望的。有谁能告诉我如何产生预期的输出,也许是使用pivot

但是,我的结果将这些组分开,当组为红色时给出结果,如果组为黄色,则返回null。但是,我希望得到这样的结果:即使组是黄色的,数据仍然不是空的,只是重复前面的数字。也许用pivot试试

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。这是第二个条件中的一个输入错误。