Comparar columnas
Necesitaría mostrar en una consulta, por ejemplo las ventas en un mes y en otra las del mismo mes, pero en otro año. ¿Qué forma seria la más lógica para hacerlo? (Access 97)
1 Respuesta
Respuesta de raulmoscardo
1
1
Una forma sencilla de agrupar fechas en una consulta es usando el Asistente para consultas sencillas, en el primer paso seleccionas la Tabla/Consulta y los campos de los que vas a sacar los datos, en el 2º paso hay que seleccionar la opción Resumen (tienes que incluir una Opción de resumen, aunque solo sea una suma), en el tercer paso es cuando nos pide como queremos agrupar las fechas (marca la opción Mes), guarda la consulta y finaliza el Asistente.
Usando Neptuno.mdb tabla Pedidos. El resultado en este caso:
1.
SELECT DISTINCTROW Pedidos.IdPedido, Format$([Pedidos].[FechaPedido],'mmmm yyyy') AS [FechaPedido Por mes], Sum(Pedidos.Cargo) AS [Suma De Cargo]
FROM Pedidos GROUP BY Pedidos.IdPedido, Format$([Pedidos].[FechaPedido],'mmmm yyyy'), Year([Pedidos].[FechaPedido])*12+DatePart('m',[Pedidos].[FechaPedido])-1;
Es una consulta con nuestro campo FechaPedido agrupado por mes y año. El inconveniente en este caso es que incluimos el campo IdPedido con lo cual no nos está agrupando realmente por mes (veras que se repite el mismo mes y año).
2.
Esta otra consulta es igual que la otra pero solo con los campos FechaPedido y Cargo (sacamos el promedio):
SELECT DISTINCTROW Format$([Pedidos].[FechaPedido],'mmmm yyyy') AS [FechaPedido Por mes], Avg(Pedidos.Cargo) AS [Promedio De Cargo]
FROM Pedidos GROUP BY Format$([Pedidos].[FechaPedido],'mmmm yyyy'), Year([Pedidos].[FechaPedido])*12+DatePart('m',[Pedidos].[FechaPedido])-1;
y este es el resultado:
FechaPedido/mes Promedio/Cargo
agosto 1994 $ 58,55
septiembre 1994 $ 55,89
octubre 1994 $ 48,85
enero 1995 $ 90,28
febrero 1995 $ 57,76
NOTA: a partir de una de estas consultas se puede hacer una de referencias cruzadas o una subconsulta.
Usando Neptuno.mdb tabla Pedidos. El resultado en este caso:
1.
SELECT DISTINCTROW Pedidos.IdPedido, Format$([Pedidos].[FechaPedido],'mmmm yyyy') AS [FechaPedido Por mes], Sum(Pedidos.Cargo) AS [Suma De Cargo]
FROM Pedidos GROUP BY Pedidos.IdPedido, Format$([Pedidos].[FechaPedido],'mmmm yyyy'), Year([Pedidos].[FechaPedido])*12+DatePart('m',[Pedidos].[FechaPedido])-1;
Es una consulta con nuestro campo FechaPedido agrupado por mes y año. El inconveniente en este caso es que incluimos el campo IdPedido con lo cual no nos está agrupando realmente por mes (veras que se repite el mismo mes y año).
2.
Esta otra consulta es igual que la otra pero solo con los campos FechaPedido y Cargo (sacamos el promedio):
SELECT DISTINCTROW Format$([Pedidos].[FechaPedido],'mmmm yyyy') AS [FechaPedido Por mes], Avg(Pedidos.Cargo) AS [Promedio De Cargo]
FROM Pedidos GROUP BY Format$([Pedidos].[FechaPedido],'mmmm yyyy'), Year([Pedidos].[FechaPedido])*12+DatePart('m',[Pedidos].[FechaPedido])-1;
y este es el resultado:
FechaPedido/mes Promedio/Cargo
agosto 1994 $ 58,55
septiembre 1994 $ 55,89
octubre 1994 $ 48,85
enero 1995 $ 90,28
febrero 1995 $ 57,76
NOTA: a partir de una de estas consultas se puede hacer una de referencias cruzadas o una subconsulta.
Perdón, si no me exprese bien.
La consulta que necesito hacer seria tomando como base neptuno:
Sacar el cargo de los pedidos de los clientes dado un mes y en la misma consulta, otra columna, el cargo del mismo mes pero en el año anterior para poder compararlos.
Te pido perdón y gracias
La consulta que necesito hacer seria tomando como base neptuno:
Sacar el cargo de los pedidos de los clientes dado un mes y en la misma consulta, otra columna, el cargo del mismo mes pero en el año anterior para poder compararlos.
Te pido perdón y gracias
No hay de que y tampoco nada que perdonar, se trata de intentar echar una mano. Si lo que quieres es el resultado en columnas lo más fácil es una consulta de tablas de referencias cruzadas, usando la tabla Pedidos y visto en SQL quedaría así:
TRANSFORM Sum(Pedidos.Cargo) AS SumaDeCargo
SELECT Sum(Pedidos.Cargo) AS [Total de Cargo], Format([FechaPedido],"mmm") AS MiMes
FROM Pedidos
GROUP BY Format([FechaPedido],"mmm")
PIVOT Format([FechaPedido],"yyyy");
TRANSFORM Sum(Pedidos.Cargo) AS SumaDeCargo
SELECT Sum(Pedidos.Cargo) AS [Total de Cargo], Format([FechaPedido],"mmm") AS MiMes
FROM Pedidos
GROUP BY Format([FechaPedido],"mmm")
PIVOT Format([FechaPedido],"yyyy");
Muchas gracias, pero me quedaría corto, serias capaz de hacer algo como esto:
comercial|calidad|articulo|cantidad vendida mes X|importe vendido mes X|cantidad vendida mes Y|importe vendido mes Y|dif cantidad|dif importe|
Yo lo he conseguido, pero haciendo dos consultas y uniéndolas. Esto me lleva al siguiente problema. ¿Se pueden grabar consultas en access usando ADO?, me explico ese mes POR o Y como puedes suponer es variable, ...
Mi intención es generar un recordset que luego asociaría a un report. ¿Voy por buen camino?
Muchas gracias.
comercial|calidad|articulo|cantidad vendida mes X|importe vendido mes X|cantidad vendida mes Y|importe vendido mes Y|dif cantidad|dif importe|
Yo lo he conseguido, pero haciendo dos consultas y uniéndolas. Esto me lleva al siguiente problema. ¿Se pueden grabar consultas en access usando ADO?, me explico ese mes POR o Y como puedes suponer es variable, ...
Mi intención es generar un recordset que luego asociaría a un report. ¿Voy por buen camino?
Muchas gracias.
Lo de hacer una consulta con otras dos me parece una buena idea. En cuanto a lo otro, si has entrado en el camino de ADO, creo que si, vas bien. Las ayudas al respecto son bastante amplias en el mismo access.
En ADO estoy pelín verde, pero si consultas en ADO210. CHM encontrarás bastante documentación. Ejemplo del método Execute:
Este ejemplo demuestra el método Execute cuando los ejecuta en un objeto QueryDef y en un objeto Database. Se necesitan los procedimientos EjecutarDefConsulta y ImprimirSalida para ejecutar este procedimiento.
Sub ExecuteX()
Dim dbsNeptuno As Database
Dim strSQLCambiar As String
Dim strSQLRestaurar As String
Dim qdfCambiar As QueryDef
Dim rstEmpleados As Recordset
Dim errBucle As Error
' Define dos instrucciones SQL para consultas de acciones.
strSQLCambiar = "UPDATE Empleados SET País = " & _
"'Estados Unidos' WHERE País = 'EE.UU.'"
strSQLRestaurar = "UPDATE Empleados SET País = " & _
"'EE.UU.' WHERE País = 'Estados Unidos'"
Set dbsNeptuno = OpenDatabase("Neptuno.mdb")
' Crea un objeto temporal QueryDef.
Set qdfCambiar = dbsNeptuno.CreateQueryDef("", _
strSQLCambiar)
Set rstEmpleados = dbsNeptuno.OpenRecordset( _
"SELECT Apellidos, País FROM Empleados", _
DbOpenForwardOnly)
' Imprime un informe de los datos originales.
Debug.Print _
"Datos en la tabla Empleados antes de ejecutar la consulta "
ImprimirSalida rstEmpleados
' Ejecuta el QueryDef temporal.
EjecutarDefConsulta qdfCambiar, rstEmpleados
' Imprime un informe de los datos nuevos.
Debug.Print _
"Datos en la tabla Empleados después de ejecutar la consulta"
ImprimirSalida rstEmpleados
' Ejecuta una consulta de acciones para restaurar
' Los datos. Intercepta los errores y si es necesario comprueba la colección Errors.
On Error GoTo Err_Ejecutar
dbsNeptuno.Execute strSQLRestaurar, dbFailOnError
On Error GoTo 0
' Recupera los datos actuales volviendo a consultar el Recordset.
RstEmpleados. Requery
' Imprime un informe de los datos restaurados.
Debug.Print "Datos después de ejecutar la consulta " & _
"para restaurar la información original "
ImprimirSalida rstEmpleados
RstEmpleados. Close
Exit Sub
Err_Ejecutar:
' Notifica al usuario cualquier error resultante de
' la consulta.
If DBEngine.Errors.Count > 0 Then
For Each errBucle In DBEngine.Errors
MsgBox "Número de error: " & errBucle.Number & vbCr & _
errBucle.Description
Next errBucle
End If
Resume Next
End Sub
Sub EjecutarDefConsulta(qdfTemp As QueryDef, _
rstTemp As Recordset)
Dim errBucle As Error
' Ejecuta el objeto QueryDef especificado.
' Intercepta los errores y si es necesario comprueba la colección Errors.
On Error GoTo Err_Ejecutar
qdfTemp.Execute dbFailOnError
On Error GoTo 0
' Recupera los datos actuales volviendo a consultar el Recordset.
rstTemp.Requery
Exit Sub
Err_Ejecutar:
' Notifica al usuario cualquier error resultante
' de la consulta.
If DBEngine.Errors.Count > 0 Then
For Each errBucle In DBEngine.Errors
MsgBox "Número de error: " & errBucle.Number & vbCr & _
errBucle.Description
Next errBucle
End If
Resume Next
End Sub
Sub ImprimirSalida(rstTemp As Recordset)
' Enumera el Recordset.
Do While Not rstTemp.EOF
Debug.Print " " & rstTemp!Apellidos & _
", " & rstTemp!País
rstTemp.MoveNext
Loop
End Sub
Este ejemplo demuestra el método Execute cuando los ejecuta en un objeto QueryDef y en un objeto Database. Se necesitan los procedimientos EjecutarDefConsulta y ImprimirSalida para ejecutar este procedimiento.
Sub ExecuteX()
Dim dbsNeptuno As Database
Dim strSQLCambiar As String
Dim strSQLRestaurar As String
Dim qdfCambiar As QueryDef
Dim rstEmpleados As Recordset
Dim errBucle As Error
' Define dos instrucciones SQL para consultas de acciones.
strSQLCambiar = "UPDATE Empleados SET País = " & _
"'Estados Unidos' WHERE País = 'EE.UU.'"
strSQLRestaurar = "UPDATE Empleados SET País = " & _
"'EE.UU.' WHERE País = 'Estados Unidos'"
Set dbsNeptuno = OpenDatabase("Neptuno.mdb")
' Crea un objeto temporal QueryDef.
Set qdfCambiar = dbsNeptuno.CreateQueryDef("", _
strSQLCambiar)
Set rstEmpleados = dbsNeptuno.OpenRecordset( _
"SELECT Apellidos, País FROM Empleados", _
DbOpenForwardOnly)
' Imprime un informe de los datos originales.
Debug.Print _
"Datos en la tabla Empleados antes de ejecutar la consulta "
ImprimirSalida rstEmpleados
' Ejecuta el QueryDef temporal.
EjecutarDefConsulta qdfCambiar, rstEmpleados
' Imprime un informe de los datos nuevos.
Debug.Print _
"Datos en la tabla Empleados después de ejecutar la consulta"
ImprimirSalida rstEmpleados
' Ejecuta una consulta de acciones para restaurar
' Los datos. Intercepta los errores y si es necesario comprueba la colección Errors.
On Error GoTo Err_Ejecutar
dbsNeptuno.Execute strSQLRestaurar, dbFailOnError
On Error GoTo 0
' Recupera los datos actuales volviendo a consultar el Recordset.
RstEmpleados. Requery
' Imprime un informe de los datos restaurados.
Debug.Print "Datos después de ejecutar la consulta " & _
"para restaurar la información original "
ImprimirSalida rstEmpleados
RstEmpleados. Close
Exit Sub
Err_Ejecutar:
' Notifica al usuario cualquier error resultante de
' la consulta.
If DBEngine.Errors.Count > 0 Then
For Each errBucle In DBEngine.Errors
MsgBox "Número de error: " & errBucle.Number & vbCr & _
errBucle.Description
Next errBucle
End If
Resume Next
End Sub
Sub EjecutarDefConsulta(qdfTemp As QueryDef, _
rstTemp As Recordset)
Dim errBucle As Error
' Ejecuta el objeto QueryDef especificado.
' Intercepta los errores y si es necesario comprueba la colección Errors.
On Error GoTo Err_Ejecutar
qdfTemp.Execute dbFailOnError
On Error GoTo 0
' Recupera los datos actuales volviendo a consultar el Recordset.
rstTemp.Requery
Exit Sub
Err_Ejecutar:
' Notifica al usuario cualquier error resultante
' de la consulta.
If DBEngine.Errors.Count > 0 Then
For Each errBucle In DBEngine.Errors
MsgBox "Número de error: " & errBucle.Number & vbCr & _
errBucle.Description
Next errBucle
End If
Resume Next
End Sub
Sub ImprimirSalida(rstTemp As Recordset)
' Enumera el Recordset.
Do While Not rstTemp.EOF
Debug.Print " " & rstTemp!Apellidos & _
", " & rstTemp!País
rstTemp.MoveNext
Loop
End Sub
- Compartir respuesta
- Anónimo
ahora mismo