2013-08-26

Consulta para generar una muestra aleatoria en Ms Access

Title En la entrada anterior vimos como generar números aleatorios con la función NúmAleat. Con esa función podemos generar una muestra aleatoria de nuestros datos.

Creamos una consulta, agregamos los campos deseados, en el ejemplo todos los campos de TuTabla.* Añadimos un campo con la función NúmAleat basado en un campo numérico de la tabla, ordenamos por este campo, seleccionamos en Devuelve: el número de registros de la muestra o porcentaje del total y ejecutamos la consulta.

En SQL, la sintaxis sería:

SELECT TOP 100 TuTabla.*
FROM TuTabla
ORDER BY Rnd([campo numérico]);
Si solamente tuviéramos campos de texto, usamos la función Longitud (Len en inglés) para que nos devuelva como valor el número de caracteres de la cadena de texto. La consulta sería:
En SQL:

SELECT TOP 100 TuTabla.*
FROM TuTabla
ORDER BY Rnd(Len([campo de texto]));

Es importante señalar que la función NúmAleat con un argumento igual a cero devuelve el último número generado. Y si es negativo, repite cada vez el mismo número aleatorio para ese valor.

La solución sería usar la función Abs, que devuelve el valor absoluto de un número:
NúmAleat(Abs([campo numérico]))

En SQL:

SELECT TOP 100 TuTabla.*
FROM TuTabla
ORDER BY Rnd(Abs([campo numérico]));

Otra alternativa sería usar de nuevo la función Longitud como vimos más arriba, en este caso con un campo numérico. Así forzamos a que nos devuelva un número mayor que cero,  aunque tenga un cero o un número negativo.

En SQL:

SELECT TOP 100 TuTabla.*
FROM TuTabla
ORDER BY Rnd(Len([campo numérico]));

Entradas relacionadas

2013-08-20

Generar números aleatorios entre dos valores en Ms Access

Title En Access se pueden generar números aleatorios con la función NúmAleat(). Para generar números enteros entre un intervalo, usamos la fórmula:

Int(Límite superior- Límite inferior + 1)*NúmAleat+Límite inferior)
Hacemos clic en la celda Campo de la columna donde deseemos crear el campo calculado y escribimos la expresión necesaria:

Ejemplo, número aleatorio entre 1 y 10:

Número_Aleatorio: Int((10-1+1)*NúmAleat+1) 'En la celda,o bien 
SELECT Int((10-1+1)*Rnd()+1) AS Número_Aletorio; 'en SQL
Si no necesitamos número enteros, borramos la función Int

(Límite superior- Límite inferior + 1)*NúmAleat+Límite inferior

Entradas relacionadas

2013-08-17

Lógica de Boole en lugar de la función SI- Parte 2

En la entrada anterior vimos una alternativa a los SI anidados. En aquel ejemplo evaluábamos una serie de condiciones y devolvíamos un valor. ¿Qué sucedería si quisiéramos que en lugar de un valor devuelva un texto? Por ejemplo, en una celda podemos tener: a, b, c, o d. Y en función de la letra queremos que devuelva respectivamente: primero, segundo, tercero o cuarto.

Opción 1 - SI anidados
=SI(A1="a";"primero";SI(A1="b";"segundo";SI(A1="c";"tercero";SI(A1="d";"cuarto"))))
Seguiríamos la sintaxis habitual de los SI anidados sin problema.

Opción 2 -Boole
=REPETIR("primero";A1="a")&REPETIR("segundo";A1="b")&REPETIR("tercero";A1="c")&REPETIR("cuarto";A1="d"))

En este caso no podríamos usar la estructura de la entrada anterior pues =(A1="a")*"primero" daría un error. Empleamos la función REPETIR(texto;núm_de_veces), que repite el texto indicado un determinado número de veces, 1 si la condición es verdadera o 0 si es falsa. Al encadenar las diferentes condiciones, solamente mostrará la verdadera o nulo (celda en blanco)si no se cumple ninguna. Si en lugar de nulo queremos que nos muestre un valor, habría que añadir el siguiente trozo al final.
&REPETIR("Otro";(A1<>"a")*(A1<>"b")*(A1<>"c")*(A1<>"d")
                                       'o bien
&REPETIR("Otro";NO(O(A1={"a";"b";"c";"d"})))

Entradas relacionadas:
Lógica de Boole en lugar de la función SI -Parte 1

2013-08-11

Lógica de Boole en lugar de la función SI -Parte 1

SI() es una de las funciones más útiles y utilizadas en Excel. Básicamente, comprueba si se cumple una condición y devuelve un valor si se evalúa como VERDADERO y otro valor si se evalúa como FALSO. Sin embargo, en muchas ocasiones podemos obtener los mismos resultados de una manera más sencilla: usando la lógica de Boole.

Comparamos si A3 es mayor que B1.
=SI(A3>$B$1;VERDADERO;FALSO) 'Usando la función SI
=A3>$B$1                     'Usando lógica de Boole
Ambas fórmulas nos devolverán VERDADERO o FALSO. Pero la segunda fórmula, es más corta y clara, y Excel la calcula más rápidamente.


Puede ser útil tener esas expresiones lógicas evaluadas como 1 (VERDADERO) o 0 (FALSO). Excel trata los valores de Boole como 1 o 0 cuando los combinamos con operaciones matemáticas.
=(A3>$B$1)*1   'Multiplicando por 1       
=--(A3>$B$1)   'Usando dos signos negativos (operador unario)


También podemos asignar usar la misma lógica en lugar de SI anidados. Por ejemplo, asignar una ganancia cuando las cifras anteriores alcanzan unos objetivos:


Opción 1 - SI anidados
=SI(A3>50000;1000;SI(A3>45000;750;SI(A3>35000;750;SI(A3>25000;250;0))))) 'SI
Evalua cada condición secuencialmente de izquierda a derecha, y si se cumple alguna condición se detiene.

Opción 2 -Boole
=(A3>25000)*250+(A3>35000)*250+(A3>45000)*250+(A3>55000)*250        'Boole
Evalua toda la expresión a la vez sin detenerse. Por ejemplo si A3>35000, cumple las dos primeras condiciones.
=(VERDADERO)*250 + (VERDADERO)*250 + (FALSO)*250+ (FALSO)*250




=(1)*250 + (1)*250 + (0)*250+ (0)*250 




=500
Por esa razón, porque se acumulan las condiciones cumplidas, indicamos los incrementos de la ganancia entre cada intervalo en lugar del total de la ganancia.

Esta segunda opción es más breve, más rápida de calcular por Excel, y más fácil de escribir y de leer que la función SI anidada.

Entradas relacionadas:

Lógica de Boole en lugar de la función SI -Parte 2

2013-08-05

Importar un fichero de texto en Access conservando los decimales

Es posible que al importar un fichero de texto, en alguno de los campos numéricos se trunquen los decimales. Una posible causa es que ninguno de los 25 primeros registros de ese campo incluya decimales. Access evalua las 25 primeras filas y determina el tipo de dato para los campos de la tabla. Si no encuentra ningún decimal en los 25 primeros registros de un campo sugiere como tipo de dato el entero largo, en lugar del doble.

Para corregir este comportamiento y conservar los decimales de un campo numérico al que Access asigna el tipo entero largo, tenemos dos opciones dentro del Asistente para importación de texto:

Opción1- 

Seleccionamos el campo (clic sobre la columna correspondiente) y en el desplegable Tipo de dato, escogemos Doble y presionamos Siguiente.


Opción2- 

Hacemos clic sobre Avanzado... y en el desplegable Tipo de dato, escogemos Doble, y clic sobre Aceptar.


Otra manera menos eficiente sería importar el campo como texto y luego transformarlo en numérico con una consulta.

2013-08-01

Porcentaje del total de la columna en una consulta de Access

Title En Access es muy sencillo crear una consulta agrupada por el campo que deseemos.

En este caso tenemos una tabla de ventas con diferentes campos (Negocio, Segmento, etc.) y queremos agrupar los resultados en Unidades y Ventas por Categoría. Deseamos que nos ordene los resultados de manera descendente en función de las Ventas. El resultado sería:

Adicionalmente, nos gustaría saber el porcentaje de cada categoría sobre el total de unidades y de ventas. Por ejemplo, el porcentaje que 15.740.717 de unidades de Color representa sobre el total de unidades, 43.845.549.

Para ello creamos dos campos calculados (columnas), uno para las unidades y otro para las ventas:

%Unidades: [Unidades]/DSuma("Unidades";"tbl_ventas")
%Ventas: [Ventas]/DSuma("Ventas";"tbl_ventas")
Dividimos los alias [Unidades] y [Ventas] por sus totales correspondientes. Usamos la función Dsuma ("Nombre del Campo";"Nombre de la Tabla";"Criterio") para calcular dichos totales.  Recuerda poner las dobles comillas alrededor del nombre del campo y de la tabla, así como seleccionar Expresión en Total:

El resultado final es:

Ahora, de un vistazo, sabemos exactamente el porcentaje de cada categoría en unidades y ventas sobre el total de las mismas. Además, hemos añadido el campo calculado

Contribución para conocer la contribución de ventas por unidad en cada categoría. Por ejemplo, la categoría Relojes es la que aporta más ventas por unidad vendida.

Contribucion: [Ventas]/[Unidades]

Referencias

Nube de datos