Pl / SQL - Oracle 9i - Поворот вручную - PullRequest
0 голосов
/ 15 июня 2011

У нас есть таблица с тремя столбцами:

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.

Как лучше всего подойти к этому?

Ответы [ 4 ]

2 голосов
/ 15 июня 2011

Существуют простые решения с 10g и 11g, использующие LISTGAGG, COLLECT или другие возможности, добавленные после 9i, но я считаю, что следующее будет работать в 9i.
Источник (http://www.williamrobertson.net/documents/one-row.html)

Вам просто нужно заменить deptno на customer_name и указать на 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.
2 голосов
/ 15 июня 2011

Вам нужно вручную выполнить разворот:

  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;
1 голос
/ 15 июня 2011

Это создаст сохраненный FUNCTION, что означает, что вы можете получить к нему доступ в любое время.

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;

Надеюсь, это поможет, и, пожалуйста, дайте мне знать, если есть какие-либо ошибки, я сам не запускал функцию.

0 голосов
/ 15 июня 2011

Просто сделай

select Number_of_people
from table
where Customer_name = 1

Нам не хватает какой-то детали?

...