8 junio, 2023

REALIZAR CONSULTAS SQL DE UNIÓN EN EXCEL CON ADO

Hola a todos!:

Hacía tiempo que no subía un post nuevo, pero últimamente estoy bastante escaso de tiempo y esta semana me han enviado algunas consultas de gran complejidad, lo que me ha dejado poco margen para publicar. Pero hoy sí puedo : )

Para este post escribiré acerca de las ventajas de las consultas de unión a la hora de realizar nuestros trabajos y programaciones.

Básicamente una consulta de unión se especifica en SQL con las instrucciones UNION y UNION ALL, ambas realizan el trabajo de unir dos o más consultas SQL, solo que cuando es UNION el resultado de la consulta solo devuelve los valores distintos (sin duplicados) y cuando es UNION ALL devuelve todos los valores (pueden incluir duplicados).

Para el ejemplo de hoy se podrían utilizar ambas, dado que los elementos son distintos en las dos bases de datos.

Imaginad que tenemos dos tablas (que pueden ser archivos independientes, pero para este ejemplo lo hago todo dentro del mismo archivo). Una se corresponde con un grupo de trabajadores de unos grandes almacenes y la otra con otro grupo, las llamaré GRUPO1 y GRUPO2 respectivamente:

REALIZAR CONSULTAS SQL DE UNION EN EXCEL

Pues bien, deseamos obtener un único archivo con lo siguiente:

Del GRUPO1 personas con sexo = «MUJER» y estudios = «DIPLOMADOS» y que los nombres no sean nulos (dado que hemos detectado que en algunas ocasiones el campo «NOMBRE COMPLETO» tiene celdas vacías. La sentencia SQL sería esta:

"SELECT [GRUPO1$].[NOMBRE COMPLETO],[GRUPO1$].[EDAD], [GRUPO1$].[SEXO], [GRUPO1$].[ESTUDIOS], 'GRUPO1' AS GRUPO FROM [GRUPO1$] WHERE NOT [GRUPO1$].[NOMBRE COMPLETO] IS NULL AND [GRUPO1$].[SEXO]='MUJER' AND [GRUPO1$].[ESTUDIOS]='DIPLOMADOS' "

Del GRUPO2 personas con sexo = «HOMBRE» y estudios = «DIPLOMADOS» y que los nombres no sean nulos (dado que hemos detectado que en algunas ocasiones el campo «NOMBRE COMPLETO» tiene celdas vacías. La sentencia SQL sería esta:

SELECT [GRUPO2$].[NOMBRE COMPLETO],[GRUPO2$].[EDAD], [GRUPO2$].[SEXO], [GRUPO2$].[ESTUDIOS], 'GRUPO2' AS GRUPO FROM [GRUPO2$] WHERE NOT [GRUPO2$].[NOMBRE COMPLETO] IS NULL AND [GRUPO2$].[SEXO]='HOMBRE' AND [GRUPO2$].[ESTUDIOS]='DIPLOMADOS' "

Una vez definidas las consultas, introducimos la instrucción UNION ALL y componemos nuestro string para pasar la consulta en nuestro código, así sería completo:

obSQL = "SELECT [GRUPO1$].[NOMBRE COMPLETO],[GRUPO1$].[EDAD], [GRUPO1$].[SEXO], [GRUPO1$].[ESTUDIOS], 'GRUPO1' AS GRUPO FROM [GRUPO1$] WHERE NOT [GRUPO1$].[NOMBRE COMPLETO] IS NULL AND [GRUPO1$].[SEXO]='MUJER' AND [GRUPO1$].[ESTUDIOS]='DIPLOMADOS' UNION ALL " & _
"SELECT [GRUPO2$].[NOMBRE COMPLETO],[GRUPO2$].[EDAD], [GRUPO2$].[SEXO], [GRUPO2$].[ESTUDIOS], 'GRUPO2' AS GRUPO FROM [GRUPO2$] WHERE NOT [GRUPO2$].[NOMBRE COMPLETO] IS NULL AND [GRUPO2$].[SEXO]='HOMBRE' AND [GRUPO2$].[ESTUDIOS]='DIPLOMADOS' "

El resultado de ejecutar la consulta sería el siguiente:

REALIZAR CONSULTAS SQL DE UNION EN EXCEL1

Efectivamente, nuestras dos consultas se han unido en una única consulta. Mostrando un total de 3 mujeres en el GRUPO1 y 1 hombre en el GRUPO2. Indicar que tal y como queríamos hemos obviado las celdas en blanco del campo NOMBRE COMPLETO.

Ahora os dejo la macro completa:

Option Explicit
Sub GENERAR_CONSULTA()
Dim Dataread As ADODB.Recordset, obSQL As String
Dim cnn As ADODB.Connection, fin As Integer, milibro As String, i As Long
Dim titulo As String
fin = Application.CountA(Sheets("UNION").Range("A:A"))
'Borramos datos de consultas anteriores
Sheets("UNION").Range("A2:E" & fin + 1).Clear
'construimos nuestras dos consultas y las unimos
obSQL = "SELECT [GRUPO1$].[NOMBRE COMPLETO],[GRUPO1$].[EDAD], [GRUPO1$].[SEXO], [GRUPO1$].[ESTUDIOS], 'GRUPO1' AS GRUPO FROM [GRUPO1$] WHERE NOT [GRUPO1$].[NOMBRE COMPLETO] IS NULL AND [GRUPO1$].[SEXO]='MUJER' AND [GRUPO1$].[ESTUDIOS]='DIPLOMADOS' UNION ALL " & _
"SELECT [GRUPO2$].[NOMBRE COMPLETO],[GRUPO2$].[EDAD], [GRUPO2$].[SEXO], [GRUPO2$].[ESTUDIOS], 'GRUPO2' AS GRUPO FROM [GRUPO2$] WHERE NOT [GRUPO2$].[NOMBRE COMPLETO] IS NULL AND [GRUPO2$].[SEXO]='HOMBRE' AND [GRUPO2$].[ESTUDIOS]='DIPLOMADOS' "
'Obtenemos el nombre del libro
milibro = ThisWorkbook.Name
'Creamos la conexión ADO
Set cnn = New ADODB.Connection
With cnn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "DATA SOURCE=" & Application.ActiveWorkbook.Path + "\" & milibro
.Properties("Extended Properties") = "Excel 8.0"
.Open
End With
Set Dataread = New ADODB.Recordset
With Dataread
.Source = obSQL
.ActiveConnection = cnn
.CursorLocation = adUseClient
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
.Open
End With
'pasamos información a la hoja UNION
With Worksheets("UNION")
.Cells(2, 1).CopyFromRecordset Dataread
'Indicamos encabezados
For i = 0 To Dataread.Fields.Count - 1
titulo = Dataread.Fields(i).Name
.Cells(1, i + 1) = titulo
Next
End With
'ejecutamos el resto de consultas
Set Dataread = Nothing
Set cnn = Nothing
End Sub

Como podéis observar, la estructura del código es la misma que suelo publicar en los post en los que trabajo con ADO y SQL en Excel.

Y eso es todo. Es una forma útil cuando necesitamos consolidar información de varios archivos pero especificando criterios distintos en cada base de datos.

Descarga el archivo de ejemplo pulsando en: REALIZAR CONSULTAS SQL DE UNIÓN EN EXCEL CON ADO

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

Comparte este post

4 comentarios en «REALIZAR CONSULTAS SQL DE UNIÓN EN EXCEL CON ADO»

  1. Muchas gracias por tu aporte, es de mucha utilidad. Muy clara la explicación y el archivo de ejemplo ayuda aun mas a entender el funcionamiento.

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies