Foro de Cobol
Registrate en el Foro de Cobol y Aporta tus experiencias y conocimientos sobre este lenguaje de programacion, con tu ayuda el foro crecera y todos nos podremos beneficiar de los conocimientos de los demas.

Gracias por entrar a COBOLEROS.ES
Síguenos en Twitter

5.16 OPCIONES DE LA INSTRUCCION SELECT

Ver el tema anterior Ver el tema siguiente Ir abajo

5.16 OPCIONES DE LA INSTRUCCION SELECT

Mensaje por Coboler@ el Dom Mar 11, 2012 10:15 pm

OPERACIONES ARITMETICAS

La instruccion SELECT se puede usar para realizar operaciones aritmeticas con los datos antes de que sean proporcionados al programa. Esto se consigue mediante operadores aritmeticos en la lista de columnas.


Los operadores aritmeticos se pueden usar con columnas de datos.

El valor de la expresion aritmetica se asigna a una variable, pero se reemplaza al valor de la columna de la tabla o vista.


FUNCIONES BUILT-IN

Permiten obtener informacion acerca de las filas que satisfacen la condicion de busqueda. Se puede incluir mas de una en cada instruccion SELECT. La funcion BUILT-IN se aplica a cada fila que satisface la condicion de busqueda, ignorando los valores nulos.

AVG
Promedio de los valores de una o mas columnas que contengan datos numericos.

MAX
Maximo valor de una o mas columnas.

MIN
Minimo valor de una o mas columnas.

SUM
Suma del valor de una o mas columnas.

COUNT
Numero de filas que satisfacen la condicion de busqueda:

EXEC SQL
SELECT COUNT(*)
INTO EMP-COUNT
FROM DSN-EMP
WHERE JOBCODE >= 50
END-EXEC

Numero de valores unicos de una columna en particular:

EXEC SQL
SELECT COUNT (DISTINCT DEPTNO)
INTO DST-COUNT
FROM DSN-EMP
END-EXEC



CLAUSULAS GROUP BY, HAVING Y ORDER BY

No se pueden especificar en una instruccion SELECT dentro de la DECLARE CURSOR, cuando se pretenda actualizar una columna o borrar una fila.

GROUP BY

Divide las filas que satisfacen la condicion de busqueda en grupos segun una o mas columnas especificadas en esta clausula. El resultado es la aplicacion de una funcion BUILT-IN, no sera ya un valor unico, sino tantos valores como grupos. Si hay valores nulos en una columna espeficada en GROUP BY, el DB2 los considera en un grupo por separado.

Ejemplo:
Calculo del salario medio por departamento el resultado sera una columna por departamento al no especificar WHERE, se procesan todas las filas

EXEC SQL
DECLARE XYZ CURSOR FOR
SELECT WORKDEPT, AVG(SALARY)
FROM DSN-EMP
GROUP BY WORKDEPT
END-EXEC
.......................................
EXEC SQL
FETCH XYZ
INTO :WORK-DEPT, :AVG-SALARY
END-EXEC

Es posible agrupar por mas de una columna.

Ejemplo:

Calculo del salario medio por departamento y por sexo. El resultado seran dos filas por departamento (una por cada sexo), para las cuales se calculara el promedio.


EXEC SQL
DECLARE XYZ CURSOR FOR
SELECT WORKDEPT, SEX, AVG(SALARY)
FROM DSN-EMP
GROUP BY WORKDEPT, SEX
END-EXEC
.......................................
EXEC SQL
FETCH XYZ
INTO :WORK-DEPT, :SEX, :AVG-SALARY
END-EXEC

HAVING
Se usa seguida de la clausula GROUP BY, para especificar que solo se desean los grupos que satisfagan una condicion.

Se codifica como la clausula WHERE, pudiendo contener predicados multiples, la clausula DISTINCT, HAVING NOT, y funciones BUILT-IN.

Ejemplo:
Calculo del salario medio de las mujeres por departamento, pero solo para los departamentos en los que todos los empleados poseen un nivel de educacion igual o superior a 16.

EXEC SQL
DECLARE XYZ CURSOR FOR
SELECT WORKDEPT, AVG(SALARY), MIN(EDUCL
FROM DSN-EMP
WHERE SEX = 'F'
GROUP BY WORKDEPT
HAVING MIN(EDUCLVL) >= 16
END-EXEC
.......................................
EXEC SQL
FETCH XYZ
INTO :WORK-DEPT, :AVG-SALARY, :MIN-EDUC
END-EXEC



ORDER BY


Indica el orden en el que se quieren recuperar las filas, el cual se especifica mediante el nombre de la columna o columnas, o un numero (ORDER BY 3 especifica que se quiere ordenar por la tercera columna de la tabla de resultados) cuando en la SELECT no se ha especificado un nombre de columna sino una expresion aritmetida, funcion BUILT-IN...

Todas las columnas de la clauSula ORDER BY se han de haber especificado en la SELECT.

Por defecto se toma orden ascendente. Si se encuentran valores nulos son tratados como los mas altos. Los caracteres graficos se ordenan en secuencia EBCDIC.

Se pueden especificar secuencias de orden secundarias.

Ejemplo:

Recuperar el nombre y numero de departamento de las mujeres empleadas ordenado por numero de departamento descendente, y dentro del departamento por nombre de empleado.

EXEC SQL
DECLARE XYZ CURSOR FOR
SELECT EMPNAME, WORKDEPT
FROM DSN-EMP
WHERE SEX = 'F'
ORDER BY WORKDEPT DESC, EMPNAME
END-EXEC
.......................................
EXEC SQL
FETCH XYZ
INTO :PGM-NAME, :WORK-DEPT
END-EXEC



UNION
Permite combinar dos o mas instrucciones SELECT para formar una unica tabla de resultados, eliminando las filas duplicadas. Se usa para juntar valores de varias tablas, pero el conjunto de filas seleccion de una tabla es añadido al conjunto de filas seleccionado de otra.

Los tipos de datos y longitudes de las columnas nombradas en la instruccion SELECT deben ser identicos. Por ejemplo, SELECT A, B UNION X la columna A debe ser identica a la X, y la columna B a la Y.

Para especificar las columnas por las que se quiere ordenar se deben usar numeros, y nunca nombres de columnas.

Para identificar de que instruccion SELECT procede cada fila, se incluye una constante al final de la lista de cada SELECT.

SELECT A, B, 'A1' UNION X, Y, 'B1'

El DB2 devolvera la constante correspondiente a cada instruccion SELECT en la ultima columna de la fila.

Ejemplo:

EXEC SQL
DECLARE XYZ CURSOR FOR
SELECT EMPNO
FROM DSN.EMP1
WHERE WORKDEPT = :WORK-DEPT
UNION
SELECT DISTINCT EMPNO
FROM DSN-EMP2
WHERE PROJNO = :NUM-PROY
END-EXEC
.......................................
EXEC SQL
FETCH XYZ
INTO :EMP-NUMBER
END-EXEC
avatar
Coboler@
Admin

Mensajes : 215
Reputación : 19
Fecha de inscripción : 02/02/2011
Edad : 37
Localización : Madrid

Ver perfil de usuario http://www.coboleros.es

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.