Oracle Sql 查询一条记录大数据中的报表

     2023-05-09     298

关键词:

【中文标题】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查询数据只要排序后的第一条记录(不用rownum=1),sql语句怎么写

参考技术A1、创建测试表,createtabletest_order(idnumber,valuevarchar2(50));2、插入测试数据insertintotest_ordervalues(3,'v3');insertintotest_ordervalues(2,'v2');insertintotest_ordervalues(1,'v1');insertintotest_ordervalues(5,'v5');insertintotest_orderv... 查看详情

为啥oracle只能查询出一条记录?

....ResultSet;importjava.sql.SQLException;importjava.sql.Statement;publicclassOracle/***@paramargs*/publicstaticvoidmain(String[]args)//TODOAuto-generatedmethodstubConnectionconn=null;PreparedStatementstatement=null;Statementstmt=null;ResultSetres=null;tryClass.forName("oracle.jdbc.driver.OracleDr... 查看详情

在oracle数据库中的分页sql语句怎么写?

...不满足条件的记录。可以这样理解:rownum是一个序列,是Oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2。依次类推:当使用“>、>=、=、between...and”这些条件时,从缓冲区或... 查看详情

限制从 Oracle 中的 SQL 查询返回的记录

】限制从Oracle中的SQL查询返回的记录【英文标题】:LimitingreturnedrecordfromSQLqueryinOracle【发布时间】:2009-01-2804:15:40【问题描述】:我负责每x秒检查一次Oracle数据库表以查看是否有新数据要处理的应用程序(其他实时应用程序正... 查看详情

一条查询oracle中的阻塞锁(以及阻塞在哪个数据上)的sql

Select'节点'||a.INST_ID||'session'||a.sid||','||a_s.SERIAL#||      '阻塞了节点'||b.INST_ID||'session'||b.SID||','||b_s.SERIAL#blockinfo,      a.INST_ID,      a 查看详情

Python查询sql db中的最后一条记录,但返回空白记录

】Python查询sqldb中的最后一条记录,但返回空白记录【英文标题】:Pythonqueryinglastrecordinsqldb,butreturningblankrecord【发布时间】:2022-01-2112:14:46【问题描述】:我正在使用PythonFlask和SQLAlchemy创建一个简单的Web应用程序,该应用程序将... 查看详情

mysql只能取出一条记录为啥不显示

...L只能取出一条记录但不显示,可能有以下几个原因:1.SQL查询语句的筛选条件不正确:可能筛选条件不准确或者数据中没有符合条件的记录,导致查询结果为空。需要检查SQL语句是否正确,并尝试修改筛选条件。2.数据库连接被... 查看详情

使用oracle,如何做到某个时间段内每间隔1分钟查询出一条记录?

...数据中的距离开始时间每间隔1分钟的那些记录参考技术Aoracle中date-date是一个浮点数,以日为单位吧,你拿差一分钟的两个date格式数据相减,然后使用数据循环加这个数值就可以了总之date+float=datedate-date=float希望你能看懂 参考... 查看详情

报表对象可以实现数据的显示和编辑吗

...中的全部数据。表中的行:记录。表中的列:字段。2、查询:查询是数据设计目的的体现,用来检索符合指定条件的数据的对象。利用查询可以查看、更改以及分析数据,也可以将查询作为窗体和报表的数据源。包括有选择查... 查看详情

Sql 查询为表中的每个组合返回一条记录

】Sql查询为表中的每个组合返回一条记录【英文标题】:Sqlquerytoreturnonesinglerecordpereachcombinationinatable【发布时间】:2012-05-0520:54:43【问题描述】:我需要(from_id,to_id)的每个组合的结果,它具有最小值和匹配条件的循环。所以基本... 查看详情

在oracle数据库表中没有添加rowid字段为啥会出现

rowid是oracle数据库表中的伪列,rowid首先是一种数据类型,它唯一标识一条记录物理位置,基于64位编码的18个字符显示。因为rowid是伪列,所以并未真的存储在表中,但可以从表中查询,但不支持插入,更新,删除它们的值。其他... 查看详情

oracle记录中选择出第一条记录

一个oracle表,字段IDBAL000015.000000110.000000115.00000025.00000029.00000027.00……问我怎么取到每个不同ID号BAL值最大的那条记录?oracle记录中选择出第一条记录的方法。如下参考:1.创建测试表Createtabletest_order(idnumber,valuevarchar2(50)... 查看详情

oracle中如何只查询一条复合条件的记录,即查到一条记录就返回

oracle中如何只查询一条复合条件的记录,即查到一条记录就返回类似于sqlserver中的selecttop1*from。。。的功能Oracle没有类似Top的语句,一般用RowNum和OrderBy组合来实现,以下语句表示取记录集的前N条记录SELECT 列名1...列名n... 查看详情

oracle删除重复数据只留一条

 查询及删除重复记录的SQL语句 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select*from表whereIdin(selectIdfrom表groupbyIdhavingcount(Id)>1) 2、删除表中多余的重复记录,重复记录是根据单个字段(Id... 查看详情

SQL查询从链接表中检索最后一条记录[重复]

】SQL查询从链接表中检索最后一条记录[重复]【英文标题】:SQLquerytoretrievelastrecordfromalinkedtable[duplicate]【发布时间】:2016-09-1719:09:06【问题描述】:我编写了一个查询来比较不同表中的2列(TRELAYVSTUSERDEF8)。该查询效果很好,只是... 查看详情

怎么查询sql数据库的历史数据,并调用出来做报表?

...9;)andconvert(datetime, '2015-08-0108:12:08')以上SQL就是查询历史记录,日期为'2015-08-0108:08:08'与'2015-08-0108:12:08'之间的数据创建报表可以通过Microsoft SQL Server 2008 R2中的Business Intelligence Development... 查看详情

返回子查询中的最后一条记录 - MySQL

】返回子查询中的最后一条记录-MySQL【英文标题】:Returninglastrecordinasubquery-MySQL【发布时间】:2021-01-3109:16:29【问题描述】:所以我正在为我的网站创建一个类似于Facebook风格的消息系统(我知道是对的)。我打算发生的是列出... 查看详情

oracle我有1000条查询语句,通过执行每一条sql语句,返回所有的查询结果为空的记录,能实现吗?

...或者返回这两个sql,或者返回查询条件id可以实现,利用oracle的存储过程,用指针,很容易就解决了。因为指针就是一个for循环,在该循环裏面可以处理每一条数据。希望对你有用追问可不可以写个简单的例子?我对数据库的操... 查看详情