使用 SQL*Plus 从以前的 SELECT 中选择总计

Posted

技术标签:

【中文标题】使用 SQL*Plus 从以前的 SELECT 中选择总计【英文标题】:SELECT totals from previous SELECT using SQL*Plus 【发布时间】:2013-11-06 13:24:45 【问题描述】:

使用 SQL*Plus 生成通过电子邮件发送给客户的列表,例如:

SET MARKUP html ON
SPOOL spool.html
SELECT order_number, entry_date, delivery_date, customer_order_number, order_totals_quantity, TRUNC(order_totals_sqm,2), order_totals_net_value FROM orders WHERE entry_date = SYSDATE;

我怎样才能创建一个行来显示列出的order_totals 字段的总数并使它们与这些字段保持一致?

即如果我为这些字段创建了单独的 SELECT COUNT(),它会将它们列在前 3 个之下,而实际上它们需要位于原始 SELECT 之下。

更新:这就是我正在寻找的,如果可能的话。

other columns ... order_totals_quantity | TRUNC(order_totals_sqm,2) | order_totals_net_value
--------------------------------------------------------------------------------------------
                  Total                 | Total                     | Total

【问题讨论】:

能否请您显示完整的 SELECT 语句?您的示例是无效语句(缺少 FROM) 我相信 group by grouping sets 的使用是您所追求的,但我需要查看预期结果示例才能知道您想如何处理它 我已经用例如更新了问题 【参考方案1】:

也许... 取决于您想要什么聚合以及什么表示唯一记录,以免错误地汇总数量。

SELECT order_number, entry_date, delivery_date, customer_order_number, 
  sum(order_totals_quantity), sum(TRUNC(order_totals_sqm,2)), sum(order_totals_net_value)
FROM orders 
WHERE entry_date = SYSDATE;
GROUP BY GROUPING SETS ((order_number, entry_date, delivery_date, customer_order_number),
         ())

找到的示例:http://www.oracle-base.com/articles/misc/rollup-cube-grouping-functions-and-grouping-sets.php

【讨论】:

查看您的链接,我想知道 OP 是否实际上不在 GROUP BY ROLLUP 之后 我用例如更新了这个问题。如果有帮助,我正在寻找什么。 @user2656114 那么上​​面列出的 Group By Rollup 或 group by 分组集是否满足您的需求?【参考方案2】:

试试这个[假设您使用的是 oracle]:

SELECT order_number, entry_date, delivery_date, customer_order_number, order_totals_quantity, TRUNC(order_totals_sqm,2), order_totals_net_value,tot.a, tot.b 
FROM orders, (select sum(order_totals_quantity) a, sum(order_totals_net_value ) b from orders WHERE entry_date = SYSDATE) tot 
WHERE entry_date = SYSDATE;

【讨论】:

【参考方案3】:

当您使用 SQL*Plus 时,有一种使用计算的更简单的方法。这样做的好处是无需在服务器上运行额外的 SQL。这是一个您可以根据自己的查询进行调整的示例:

    BREAK ON report
    COMPUTE SUM LABEL total OF a ON report

    SELECT 1 AS a FROM dual UNION ALL
    SELECT 2 AS a FROM dual UNION ALL
    SELECT 3 AS a FROM dual;

                A
    -------------
                1
                2
                3
    -------------
                6

    3 rows selected.

您也可以使用其他聚合。这是完整文档的链接:COMPUTE。

【讨论】:

以上是关于使用 SQL*Plus 从以前的 SELECT 中选择总计的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL*Plus 中将参数(值)从函数传递/调用到“选择”stmt?

如何在 PL/SQL 中使用 select 语句为 SQL*Plus 变量赋值?

SQL*Plus - 数字列显示十六进制字符

Mybatis-Plus select不列出全部字段

SQL Plus 窗口不保留所有查询和输出行

Oracle中SQL*PLUS使用的一些技巧