|
Программирование >> Преобразование значений null
select count(*) as grp, e.empno, e.ename from emp e, emp d where e.empno >= d.empno group by e.empno,e.ename order by 1 EMPNO ENAME
Итак, строки ранжированы. Теперь, чтобы создать четыре блока, просто добавляем 1 к остатку от деления GRP на 4 (это обеспечит нумерацию сегментов не с 0, а с 1). С помощью оператора ORDER BY упорядочиваем блоки по GRP: select mod(count(*),4)+1 as grp, e.empno, e.ename from emp e, emp d where e.empno >= d.empno group by e.empno,e.ename order by 1 EMPNO ENAME
10 ... 20 ..... 30 ...... Решение Ключ к решению - с помощью агрегатной функции COUNT и группировки по DEPTNO найти количество служащих в каждом отделе. После этого передать значения, возвращенные COUNT, в строковую функцию, которая формирует ряды символов * . Для формирования гистограммы используйте функцию REPEAT (повторить): 1 select deptno, 2 repeat(.,count(.)) cnt 3 from emp 4 group by deptno Oracle, PostgreSQL и MySQL Для формирования необходимых строк символов * используйте функцию LPAD: 1 select deptno, 2 lpad(.,count(.),.) as cnt 3 from emp 4 group by deptno SQL Server Гистограмма формируется с помощью функции REPLICATE: 1 select deptno, 2 replicate(.,count(.)) cnt 3 from emp 4 group by deptno 4 7782 CLARK 4 7876 ADAMS Создание горизонтальных гистограмм Задача Требуется с помощью SQL создать горизонтальные гистограммы. Например, поставлена задача отобразить количество служащих в каждом отделе в виде горизонтальной гистограммы, в которой каждый служащий представлен экземпляром символа * . Должно быть получено следующее результирующее множество: DEPTNO CNT Обсуждение Техника для всех баз данных одинакова. Единственное отличие состоит в строковых функциях, используемых для получения рядов символов * . В данном обсуждении будем опираться на решение для Oracle, но объяснение правомочно для всех решений. Первый шаг - подсчитываем количество служащих в каждом отделе: select deptno, count(*) from emp group by deptno DEPTNO COUNT(.) 10 3 20 5 30 6 Следующий шаг - возвращаем для каждого отдела соответствующее число символов * , исходя из значения, возвращенного COUNT(*). Для этого просто передаем COUNT(*) как аргумент в строковую функцию LPAD: select deptno, lpad(*,count(*),*) as cnt from emp group by deptno DEPTNO CNT 10 ... 20 ..... 30 ...... Пользователям PostgreSQL придется явно привести значение, возвращенное COUNT(*), к целому типу, как показано ниже: select deptno, lpad(*,count(*)::integer,*) as cnt from emp group by deptno DEPTNO CNT 10 ... 20 ..... 30 ...... Приведение необходимо, потому что в PostgreSQL числовой аргумент LPAD обязательно должен быть целым числом.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |