如何解决Oracle Sql查询报表一次记录大数据
每位员工都有10条记录,每条记录包括当天的9f次交易
Emp1 16/10/2020 50
Emp1 15/10/2020 30
Emp1 14/10/2020 70
我需要查询以一条记录的形式返回此数据
Emp 14/10 15/10 16/10
___ _____ _____ _____
Emp1 70 30 50
我如何编写这样的查询?
解决方法
您可以使用条件聚合,例如
SELECT Employee,SUM(CASE WHEN day = date'2020-10-14' THEN 1 ELSE 0 END) AS "14/10",SUM(CASE WHEN day = date'2020-10-15' THEN 1 ELSE 0 END) AS "15/10",SUM(CASE WHEN day = date'2020-10-16' THEN 1 ELSE 0 END) AS "16/10"
FROM t
GROUP BY Employee
或PIVOT
子句,例如
SELECT Employee,SUM("14/10") AS "14/10",SUM("15/10") AS "15/10",SUM("16/10") AS "16/10"
FROM t
PIVOT
(
COUNT(*) FOR day IN (date'2020-10-14' AS "14/10",date'2020-10-15' AS "15/10",date'2020-10-16' AS "16/10")
)
GROUP BY Employee
为了以静态方式显示结果,例如,在两种情况下,您都必须将所有列都添加到查询中,无论需要哪个日期值。相反,您可以使用包含SYS_REFCURSOR
的函数,例如
CREATE OR REPLACE FUNCTION Get_Transactions_RS RETURN SYS_REFCURSOR IS
v_recordset SYS_REFCURSOR;
v_sql VARCHAR2(32767);
v_cols VARCHAR2(32767);
BEGIN
SELECT LISTAGG( 'SUM(CASE WHEN day = '''||day||'''
THEN 1 ELSE 0
END) AS "'||TO_CHAR(day,'dd/mm')||'"',',' )
WITHIN GROUP ( ORDER BY day )
INTO v_cols
FROM (
SELECT DISTINCT day
FROM t
);
v_sql :=
'SELECT Employee,'|| v_cols ||'
FROM t
GROUP BY Employee';
OPEN v_recordset FOR v_sql;
RETURN v_recordset;
END;
/
,然后从SQL Developer的控制台进行调用,以返回每天进行数据透视的交易次数:
SQL> DECLARE
v_transactions SYS_REFCURSOR;
BEGIN
:v_transactions := Get_Transactions_RS;
END;
/
SQL> PRINT v_transactions ;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。