Программирование >>  Преобразование значений null 

1 ... 144 145 146 [ 147 ] 148 149 150 ... 219


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

7369

SMITH

7499

ALLEN

7521

WARD

7566

JONES

7654

MARTIN

7698

BLAKE

7782

CLARK

7788

SCOTT

7839

KING

7844

TURNER

7876

ADAMS

7900

JAMES

7902

FORD

7934

MILLER

Итак, строки ранжированы. Теперь, чтобы создать четыре блока, просто добавляем 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

7900

JAMES

7566

JONES

7788

SCOTT

7369

SMITH

7902

FORD

7654

MARTIN

7839

KING

7499

ALLEN

7698

BLAKE

7934

MILLER

7844

TURNER

7521

WARD



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 обязательно должен быть целым числом.



1 ... 144 145 146 [ 147 ] 148 149 150 ... 219

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика