oracle sqlplus报告计算列

时间:2014-02-12 06:46:19

标签: oracle report sqlplus

此网站的新用户,因此我可能无法正确格式化

我有一个SQLPlus报告,它有一个非常独特的要求,我似乎无法弄清楚。我需要做的是根据分隔栏的总价值显示一段文字“可用”或“完整”。

以下是报告的内容:

date    column 1    column 2      count
=====   ========    ========      =====
1/5/14  ABC         ABC           10
        DEF         DEF           20
******                            -----
total                             30 - this would be a normal compute when break on date

我需要做的是比较总计数字段(在这种情况下为30),如果是>硬编码值(比如说20)打印'Full',否则'Available'。我对任何建议都持开放态度,如果有办法在其位置替换文本或在另一条线上或在其旁边打印(或者即使我可以使标签说出文本),我也不必打印30我想要)。问题是我在sqlplus报告中应用了比较逻辑。

任何想法都将不胜感激。 非常感谢。

标记

1 个答案:

答案 0 :(得分:0)

SQLPlus只有基本的报告功能。特别是,您无法真正自定义其大部分功能,例如BREAKCOMPUTE SUM

但是,您可以使用所有SQL功能,因此您可以自定义SQL以获得所需的结果。像这样:

SQL> WITH DATA AS (
  2  SELECT DATE '2014-05-01' d, 'ABC' c1, 'ABC' c2, 10 cnt FROM dual UNION ALL
  3  SELECT DATE '2014-05-01' d, 'DEF' c1, 'DEF' c2, 20 cnt FROM dual UNION ALL
  4  SELECT DATE '2014-06-01' d, 'GHI' c1, 'GHI' c2, 10 cnt FROM dual UNION ALL
  5  SELECT DATE '2014-06-01' d, 'JKL' c1, 'JKL' c2, 5 cnt FROM dual
  6  )
  7  SELECT CASE
  8           WHEN GROUPING(c1) = 1 THEN '**Total**'
  9           ELSE to_char(d, 'dd/mm/yyyy')
 10         END dt,
 11         c1, c2, SUM(cnt),
 12         CASE
 13           WHEN GROUPING(c1) = 1 AND SUM(cnt) > 20 THEN 'Full'
 14           WHEN GROUPING(c1) = 1 AND SUM(cnt) <= 20 THEN 'Available'
 15         END AVAILABILITY
 16    FROM DATA
 17  GROUP BY d, ROLLUP ((c1, c2));

DT         C1  C2    SUM(CNT) AVAILABILITY
---------- --- --- ---------- ------------
01/05/2014 ABC ABC         10 
01/05/2014 DEF DEF         20 
**Total**                  30 Full
01/06/2014 GHI GHI         10 
01/06/2014 JKL JKL          5 
**Total**                  15 Available

6 rows selected

进一步阅读:excellent article about GROUP BY, ROLLUP and CUBE by Rob van Wijk

相关问题