我想用集合编写程序。
我有一张桌子 - employee
- 我想要返回以下内容:
我的最终记录集或数组表应返回低于值。 TEST1,TEST2,TEST3,TEST4是驻留在DESCRIPTION TABLE中的描述值,其中计数值来自employee表。
Description COUNT
TEST1 10
TEST2 15
TEST3 25
TEST4 50
请帮助实施。
答案 0 :(得分:3)
此解决方案不会使用您的DESCRIPTION
表来动态计算计数,因为这很难实现。所以,这是一个带有硬编码TESTn
描述的解决方案。
首先,创建记录类型:
CREATE TYPE count_t AS OBJECT (
description varchar2(100),
cnt NUMBER(10)
);
然后,创建表类型:
CREATE TYPE count_tt AS TABLE OF count_t;
现在,编写函数:
CREATE OR REPLACE FUNCTION counts RETURN count_tt
IS
v_result count_tt;
BEGIN
SELECT count_t(description, cnt)
BULK COLLECT INTO v_result
FROM (
SELECT
count(CASE WHEN sal < 10000 THEN 1 END) TEST1,
count(CASE WHEN dept > 10 THEN 1 END) TEST2,
count(CASE WHEN hiredate > SYSDATE - 60 THEN 1 END) TEST3,
count(CASE WHEN grade = 1 THEN 1 END) TEST4
FROM employees
) t
-- Behold, the power of unpivot!
UNPIVOT (
cnt FOR description IN ("TEST1", "TEST2", "TEST3", "TEST4")
);
RETURN v_result;
END counts;
/
现在,调用该函数,例如来自SQL:
SELECT * FROM TABLE(counts)
享受。
顺便说一下,我写了一篇博文comparing this solution from a performance perspective with others that do not use UNPIVOT