Database 如何在PL/SQL中进行汇总
假设我有一个包含用户数据的表,如下所示:Database 如何在PL/SQL中进行汇总,database,oracle,plsql,aggregate,Database,Oracle,Plsql,Aggregate,假设我有一个包含用户数据的表,如下所示: userID calltime result 1 10:20 1 1 11:00 2 1 11:30 1 2 9:30 1 2 11:00 1 3 10:00 1 3 10:30 2 3 11:00
userID calltime result
1 10:20 1
1 11:00 2
1 11:30 1
2 9:30 1
2 11:00 1
3 10:00 1
3 10:30 2
3 11:00 1
3 11:30 2
现在我想这样总结一下:
userID result1 result2
1 2 1
2 2 0
3 2 2
(total) 6 3
对我来说,汇总用户数据很好,但如何在查询中添加总计行?工会对此不起作用
非常感谢你这么做
编辑:这是我当前的查询,当然,它不起作用:
PROCEDURE P_SUMMARIZE_CALL
(
pStartDate IN DATE,
pEndDate IN DATE,
SummaryCur OUT MEGAGREEN_CUR
)
IS
BEGIN
OPEN SUMMARYCUR FOR
SELECT USERID, TOTALCALLS,CONNECTEDCALLS,RATE,NOANSWER FROM
(((SELECT USERID,
count(CALLID) AS TOTALCALLS,
sum(CONNECTED) as CONNECTEDCALLS,
sum(CONNECTED)/count(CALLID)*100 || '%' AS RATE,
(count(CALLID) - sum(CONNECTED)) AS NOANSWER
FROM CALLLOGS
WHERE STARTTIME BETWEEN pStartDate AND pEndDate
group by USERID) c
FULL OUTER JOIN USERS u
ON c.USERID = u.ID)
UNION ALL
(SELECT NULL,count(CALLID) AS TOTALCALLS,
sum(CONNECTED) as CONNECTEDCALLS,
sum(CONNECTED)/count(CALLID)*100 || '%' AS RATE,
(count(CALLID) - sum(CONNECTED)) AS NOANSWER
FROM CALLLOGS
WHERE STARTTIME BETWEEN pStartDate AND pEndDate group by NULL));
END;
我假设您正在使用GROUP BY生成当前结果。(注:请发布您当前的查询,因为很难猜测您是如何获得该结果的) 要获得所需内容,请使用分组汇总而不是分组汇总 工会对此不起作用
是的,实际上那也行。但是我建议使用UNION ALL而不是UNION,因为您的结果集似乎已经只包含不同的行,因此没有必要使用额外的计算时间来搜索要删除的重复行。我假设您正在使用GROUP BY生成当前结果。(注:请发布您当前的查询,因为很难猜测您是如何获得该结果的) 要获得所需内容,请使用分组汇总而不是分组汇总 工会对此不起作用
是的,实际上那也行。但是我建议使用UNION ALL而不是UNION,因为您的结果集似乎已经只包含不同的行,所以没有必要使用额外的计算时间来搜索要删除的重复行。有一种更快的方法 假设在“结果”字段上只能得到1或2的值,这将起作用:
SELECT userid
, SUM(DECODE (result, 1, 1, 0)) as result1
, SUM(DECODE (result, 2, 1, 0)) as result2
FROM x
GROUP BY userid;
这将产生预期的输出:
USERID RESULT1 RESULT2
--------- --------- ---------
1 2 1
2 2 0
3 2 2
如果字段结果上的可能值大于1或2,则可以添加更多的求和解码行,或者执行前面提到的PL/SQL过程。有一种更快的方法 假设在“结果”字段上只能得到1或2的值,这将起作用:
SELECT userid
, SUM(DECODE (result, 1, 1, 0)) as result1
, SUM(DECODE (result, 2, 1, 0)) as result2
FROM x
GROUP BY userid;
这将产生预期的输出:
USERID RESULT1 RESULT2
--------- --------- ---------
1 2 1
2 2 0
3 2 2
如果字段结果上的可能值大于1或2,则可以添加更多的总和解码行,或执行上述PL/SQL过程。谢谢。我添加了查询:)@Vimvq1987:Change
groupbyuserid
到groupbyrollup(USERID)
。谢谢。我添加了查询:)@Vimvq1987:Changegroupbyuserid
为groupbyrollup(USERID)
。您使用完全外部联接有什么原因吗?这可能做的工作比必要的多,因为看起来您实际上需要一个右外部联接
,除非我弄错了。它将返回大量完全为空的行,因为您使用的是c.USERID而不是我想要的u.idid。当显示在gridcontrol中时,null值将转换为0,如果我不使用右外部联接,没有调用的用户将被忽略。您使用完全外部联接的原因是什么?这可能做的工作比必要的多,因为看起来您实际上需要一个右外部联接
,除非我弄错了。它将返回大量完全为空的行,因为您使用的是c.USERID而不是我想要的u.idid。当显示在gridcontrol中时,null值将转换为0,如果我不使用正确的外部联接,将忽略没有调用的用户。艰难的解码更紧凑,用例更灵活,也更标准的SQL。尽管解码更紧凑,用例更灵活,也更标准的SQL。