reporting - 除了 SQL*Plus 中指定的列之外,是否可以对列进行 BREAK ON?

标签 reporting sqlplus

这个很难解释,所以我会尝试在使用示例后展示我的意思。请注意,我不是在询问是否可以在 BREAK 语句中使用多个列——我知道可以。

假设我有如下查询:

SELECT  invoice_no, invoice_date, vendor, account, amount
FROM    invoice
ORDER   BY vendor, invoice_no, account

假设结果集是:

INVOICE_NO INVOICE_DATE VENDOR  ACCOUNT AMOUNT
---------- ------------ ------- ------- ------
0001       30-JAN-2009  Alpha   1000     50.00
0003       30-JAN-2009  Alpha   1000    125.00
0003       30-JAN-2009  Alpha   3000     33.33
0006       02-FEB-2009  Alpha   2000     40.00
0005       31-JAN-2009  Bravo   1000     40.00
0002       30-JAN-2009  Charlie 2000    120.75
0002       30-JAN-2009  Charlie 3000      5.00
0004       30-JAN-2009  Charlie 1000    900.50

所以你可以看到有些供应商有多个发票,有些发票有多个帐户。

要隐藏重复的供应商名称和发票编号,我可以使用 SQL*Plus 的 BREAK像这样的命令:

BREAK ON vendor ON invoice_no

产生这个结果集:

INVOICE_NO INVOICE_DATE VENDOR  ACCOUNT AMOUNT
---------- ------------ ------- ------- ------
0001       30-JAN-2009  Alpha   1000     50.00
0003       30-JAN-2009          1000    125.00
           30-JAN-2009          3000     33.33
0006       02-FEB-2009          2000     40.00
0005       31-JAN-2009  Bravo   1000     40.00
0002       30-JAN-2009  Charlie 2000    120.75
           30-JAN-2009          3000      5.00
0004       30-JAN-2009          1000    900.50

到目前为止,一切都很好。我还想隐藏重复的发票日期,以便只显示每张发票的第一个日期。但是,如果我使用这个命令:

BREAK ON vendor ON invoice_no ON invoice_date

这会过分隐藏发票 0003 和 0004 的日期,因为它们与各自供应商以前的发票相同:

INVOICE_NO INVOICE_DATE VENDOR  ACCOUNT AMOUNT
---------- ------------ ------- ------- ------
0001       30-JAN-2009  Alpha   1000     50.00
0003                            1000    125.00
                                3000     33.33
0006       02-FEB-2009          2000     40.00
0005       31-JAN-2009  Bravo   1000     40.00
0002       30-JAN-2009  Charlie 2000    120.75
                                3000      5.00
0004                    Charlie 1000    900.50

我真正想要的是类似以下的命令语法(我创造了术语 AND):

BREAK ON vendor ON invoice_no AND invoice_date

目的是,每当它在 invoice_no 中断时,也会在 invoice_date 中断(因为我知道一个发票号不能有两个发票日期):

INVOICE_NO INVOICE_DATE VENDOR  ACCOUNT AMOUNT
---------- ------------ ------- ------- ------
0001       30-JAN-2009  Alpha   1000     50.00
0003       30-JAN-2009          1000    125.00
                                3000     33.33
0006       02-FEB-2009          2000     40.00
0005       31-JAN-2009  Bravo   1000     40.00
0002       30-JAN-2009  Charlie 2000    120.75
                                3000      5.00
0004       30-JAN-2009  Charlie 1000    900.50

现在可以正确显示发票 0003 和 0004 的日期。

有什么方法可以在 SQL*Plus 中实现这一点吗?

最佳答案

你想要这样的东西:

column DUMMY NOPRINT
BREAK ON DUMMY ON vendor ON invoice_no
SELECT CONCAT (vendor, invoice_no) DUMMY, invoice_no, invoice_date, vendor, account,amount
FROM invoice
ORDER BY vendor, invoice_no, account

您将 column DUMMY 设置为未打印的位置 然后在您的选择中将其定义为您需要检查的两个字段的串联。

DUMMY 只是一个任意名称,但通常用于需要计算但不显示它的情况

额外的“ON vendor ON invoice_no”允许您控制那些与 DUMMY 中断分开的列上的 dup。同样,您可以使用 DUMMY 进行计算以获取总计等。

关于reporting - 除了 SQL*Plus 中指定的列之外,是否可以对列进行 BREAK ON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/983415/

相关文章:

ios - Google Analytics(分析)报告不显示 iOS 应用的个人用户

sql - SQL 脚本中的条件

Trello API : determine when a card changed lists?

c# - 将报表设计器集成到 .NET 应用程序中的最佳方法是什么?

mysql - 如何使用 Ruport/Ruby on Rails 按天分组?

linux - 有什么方法可以控制 Bash here 文档中的参数扩展吗?

oracle - 错误 : ORA-12154: TNS:could not resolve the connect identifier specified

linux - 无法使用 sqlplus : ORA-12154: TNS:could not resolve the connect identifier specified 连接到数据库

python - 如何使用 cx_Oracle 在 Python 中返回 SQLPLUS 变量

java - 基于数据库的报告有哪些脚本框架?