Oracle Sql 查询一条记录大数据中的报表
Posted
技术标签:
【中文标题】Oracle Sql 查询一条记录大数据中的报表【英文标题】:Oracle Sql query for report in one record large data 【发布时间】:2020-10-16 18:04:43 【问题描述】:亲爱的 我需要为每个员工每个日期的交易数量生成报告
每个员工有 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
我该如何编写这样的查询?
【问题讨论】:
如果你提前知道几天,那还不错。但如果没有,SQL 语言有一个非常严格的规则,要求您在查询编译时提前知道结果列的数量和类型。只要你能做到这一点,你就能以你的方式走向成功。甚至 SELECT * 查询也会这样做,因为表定义是已知的并且足够静态。否则,您必须分三个步骤完成:1) 运行查询以获取有关您需要哪些列的信息。 2) 使用 1 中的数据动态构建新的 SQL 语句,其中涉及所有安全/风险。 3) 从 2 运行查询。 【参考方案1】:你可以使用条件聚合比如
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 ;
【讨论】:
嗨@MuradTurk,不客气。如果您认为这是您想要的答案,欢迎您接受。以上是关于Oracle Sql 查询一条记录大数据中的报表的主要内容,如果未能解决你的问题,请参考以下文章