如何解决Pl / SQL-oracle 9i-手动透视
|| 我们有一个包含三列的表:Customer_name,Age_range,Number_of_people.
1 1-5 10
1 5-10 15
我们需要将不同年龄范围的所有人数作为单个查询的行返回。如果我们搜索客户#1,则查询应仅返回一行:
Header- Age Range (1-5) Age Range (5-10)
10 15
我们需要将所有结果都放在一行中。当我查询客户1时,结果应该是单个行组中的人数乘以age_range
。
解决这个问题的最佳方法是什么?
解决方法
您需要手动执行数据透视:
SELECT SUM(CASE WHEN age_range = \'5-10\'
THEN number_of_people
ELSE NULL END) AS nop5,SUM(CASE WHEN age_range = \'10-15\'
THEN number_of_people
ELSE NULL END) AS nop10
FROM customers
WHERE customer_name = 1;
, 在9i之后增加了使用LISTGAGG,COLLECT或其他功能的10g和11g的简单解决方案,但我相信以下内容将在9i中起作用。
来源(http://www.williamrobertson.net/documents/one-row.html)
您只需要将deptno替换为customer_name,将ename替换为Number_of_people
SELECT deptno,LTRIM(SYS_CONNECT_BY_PATH(ename,\',\'))
FROM ( SELECT deptno,ename,ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) -1 AS seq
FROM emp )
WHERE connect_by_isleaf = 1
CONNECT BY seq = PRIOR seq +1 AND deptno = PRIOR deptno
START WITH seq = 1;
DEPTNO CONCATENATED
---------- --------------------------------------------------
10 CLARK,KING,MILLER
20 ADAMS,FORD,JONES,SCOTT,SMITH
30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
3 rows selected.
, 这将创建一个存储的“ 5”,表示您可以随时访问它。
CREATE OR REPLACE FUNCTION number_of_people(p_customer_name VARCHAR2)
RETURN VARCHAR2
IS
v_number_of_people NUMBER;
v_result VARCHAR2(500);
CURSOR c1
IS
SELECT Number_of_people FROM the_table WHERE Customer_name = p_customer_name;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO v_number_of_people;
EXIT WHEN c1%NOTFOUND;
v_result := v_result || v_number_of_people || \' \' || CHR(13);
END;
END;
要运行它,请使用:
SELECT number_of_people(1) INTO dual;
希望对您有所帮助,请让我知道是否有任何错误,我自己没有对该函数进行测试。
, 做就是了
select Number_of_people
from table
where Customer_name = 1
我们缺少一些细节吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。