此网站的新用户,因此我可能无法正确格式化
我有一个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报告中应用了比较逻辑。
任何想法都将不胜感激。 非常感谢。
标记
答案 0 :(得分:0)
SQLPlus只有基本的报告功能。特别是,您无法真正自定义其大部分功能,例如BREAK
和COMPUTE 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。