Oracle Sql查询一条记录中的报表大数据
亲爱的 我需要为每个员工每个日期的交易数量生成报告 每位员工有10条记录,每条记录包括当天的9f号交易Oracle Sql查询一条记录中的报表大数据,sql,oracle,plsql,pivot,Sql,Oracle,Plsql,Pivot,亲爱的 我需要为每个员工每个日期的交易数量生成报告 每位员工有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,
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\u 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 ;
如果你提前知道日期,那还不错。但如果不是,SQL语言有一个非常严格的规则,要求您在查询编译时提前知道结果列的数量和类型。只要你能做到这一点,你就可以成功。甚至SELECT*查询也会这样做,因为表定义是已知的,并且是静态的。否则,您必须分三步执行:1)运行查询以获取所需列的信息。2) 使用1中的数据动态构建新的SQL语句,包括所有涉及的安全/风险。3) 从2.hi@MuradTurk运行查询,不客气。如果你认为这是你想要的答案,请接受。