Oracle-Pivot聚合函数结果

Oracle-Pivot聚合函数结果,oracle,aggregate-functions,pivot-table,Oracle,Aggregate Functions,Pivot Table,我有一个保存用户日常活动的表,现在我必须以下面的形式在报告中显示这些活动 我写了一个问题 select ua.UserID, count(ua.UserID), (select count(*) form user_activities t1 where t1.UserID = ua.UserID and ActivityID = 1 and t1.Date = ua.Date group by t1.UserID, t1.ActivityID, t1.Date) as Meeting, (

我有一个保存用户日常活动的表,现在我必须以下面的形式在报告中显示这些活动

我写了一个问题

select ua.UserID, count(ua.UserID), 
(select count(*) form user_activities t1 where t1.UserID = ua.UserID and ActivityID = 1 and t1.Date = ua.Date group by t1.UserID, t1.ActivityID, t1.Date) as Meeting,
(select count(*) form user_activities t1 where t1.UserID = ua.UserID and ActivityID = 2 and t1.Date = ua.Date group by t1.UserID, t1.ActivityID, t1.Date) as Training,
ua.Date
from user_activities ua
group by ua.UserID, ua.ActivityID, ua.Date
但我知道这不是一个有效的方法,活动ID是硬编码的,将来可能会有新类型的活动

你能指导我使它更具活力和效率吗

谢谢

尝试以下查询

select ua.UserID,
       ua.adate,
       count(1),
       sum(decode(ua.activityid, 1, 1, 0)) meeting,
       sum(decode(ua.activityid, 2, 1, 0)) training,
       sum(decode(ua.activityid, 3, 1, 0)) other1,
       sum(decode(ua.activityid, 4, 1, 0)) other2
  from user_activities ua
 group by ua.UserID, ua.adate
 order by ua.UserID, ua.adate
您可以使用,将助手子查询中使用的活动总数添加到分析函数中

with tab2 as (
select USERID, ACTIVITYID, TRANS_DATE,
count(*) over (partition by USERID, TRANS_DATE) as total_activities 
from tab)
select * from tab2
PIVOT (count(*) for (activityId) in
('Meeting' as "MEETING",
'Outdoor' as "OUTDOOR",
'Training' as "TRAINING"))
;
返回

   USERID TRANS_DATE        TOTAL_ACTIVITIES    MEETING    OUTDOOR   TRAINING
---------- ----------------- ---------------- ---------- ---------- ----------
         1 28.12.15 00:00:00                2          0          1          1 
         3 28.12.15 00:00:00                2          1          1          0 
         2 28.12.15 00:00:00                2          2          0          0
不幸的是,静态select无法对新活动作出反应并自动添加列

必须通过为新活动添加一行来更新PIVOT for子句中的列表

您可以使用此支持查询创建实际列表(删除最后一个逗号)


顺便说一句,除了对活动类型进行硬编码之外,没有其他方法。您将水平数据行列为垂直数据行,因此需要使用活动类型ID解码语句。为什么是动态的?因为您只使用了两个活动ID可能是Marmite和Fatihn的重复项感谢您的努力,这两个查询都比我的查询简单,并提供了预期的结果,但哪一个更有效,到目前为止,有几百条记录,但表的大小将随着时间的推移而增加time@user3141985我看不出在效率(性能)方面存在系统性差异。这两个查询都在封面下使用了
分组机制。我认为PIVOT更紧凑,更易于维护(同时添加新的值),但这当然是有争议的。。
select distinct ''''||activityId ||''' as "'||activityId||'",' from tab order by 1;