Día inicio mes para pivotar en consulta

Estoy haciendo una consulta de referencias cruzadas para separar registros por fecha, el caso es que quiero que el mes empiece por el día 25.
Usando la función Format en el campo fecha tal que así Format(SerieFecha(Año([fecha]);Mes([fecha]);25);"mmm") y luego que pivote en los nombres de los meses, pero sigue separando los valores por los meses a partir del día 1,
También lo he intentando por criterios donde al campo fecha le digo "ENTRE SerieFecha(Año([fecha]);Mes([fecha])-1;26);"mmm") Y SerieFecha(Año([fecha]);Mes([fecha]);25);"mmm")"
Pero esto solo me muestra el mes actual donde se cumple el criterio.
He estado mirando formas de pivotar el campo fecha desde sql e intentado hacerlo pero no lo consigo...
La sentencia sería:
"PIVOT Format(DateSerial(Year([fecha]),Month([fecha]),25),"mmm") In ("ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic");
¿Alguién sabe alguna manera?

Respuesta
2

Para hacer eso que buscas, necesitas crearte una función propia que te diga a qué "mes" pertenece una fecha, solo con criterios y el pivot no lo vas a conseguir.

La solución es bastante sencilla, como digo, usando una función personalizada en VBA.

Supongamos que tu "mes 01" va del 25/12 al 24/01, el "mes 02" del 25/01 al 24/02 y así hasta el "mes 12", que irá del 25/11 al 24/12.

1º/ Crea un módulo nuevo en tu BD y en él pega esta función:

Public Function fncMesPersonalizado(laFecha As Date) As String
'--------------------------------------------------------------------------------------------------------------------
' Procedimiento: fncMesPersonalizado
' Autor        : Sveinbjorn El Rojo para TodoExpertos
'                (https://www.todoexpertos.com/preguntas/ac3j44n8n67sg73h/dia-inicio-mes-para-pivotar-en-consulta)
' Fecha        : 20/01/2020
' Propósito    : Crear "meses" personalizados con inicio distinto del día 1.
'                En este caso los meses serán: "mes 01" va del 25/12 al 24/01, el "mes 02" del 25/01 al 24/02
'                y así hasta el "mes 12", que irá del 25/11 al 24/12.
'--------------------------------------------------------------------------------------------------------------------
Dim elMes As Byte
If IsNull(laFecha) Then laFecha = Date
If Day(laFecha) < 25 Then
    elMes = Month(laFecha)
Else
    elMes = Month(laFecha) + 1
End If
If elMes = 13 Then elMes = 1
FncMesPersonalizado = Choose(elMes, "mes01", "mes02", "mes03", "mes04", "mes05", "mes06", "mes07", "mes08", "mes09", "mes10", "mes11", "mes12")
End Function

2º/ En tu consulta de ref. cruzadas, en vista diseño, donde tienes el siguiente encabezado de columna:

Format(DateSerial(Year([fecha]),Month([fecha]),25),"mmm")

lo cambias por este otro (supongo que el campo en la tabla se llama "fecha"):

fncMesPersonalizado([fecha])

3º/ Como último paso, debes entrar en la Vista SQL de la consulta y cambiar los nombres de los meses en la parte del PIVOT. En este caso (con los nombres que le puse a la función), te quedaría así:

PIVOT fncMesPersonalizado([FechVta]) In ("mes01","mes02","mes03","mes04","mes05","mes06","mes07","mes08","mes09","mes10","mes11","mes12");

Te adjunto un archivo con una tabla con datos de unas ventas del último trimestre 2019, que incluye una consulta de ref. cruzadas creada con los meses "naturales", y otra con los meses "personalizados": http://www.filebig.net/files/gpsAaXwcpJ

Un saludo.


Vaya Sveinbjorn, que despliegue de medios!! no solo has dado con una solución si no que de paso me has enseñado un par de cosas más como meter funciones en las consultas y como plantear soluciones a este tipo de consultas..

Te estoy muy agradecido, tanto por la explicación como por el adjunto, lo trastearé en cuando pueda.

Gracias de nuevo, 

un saludo!

Estamos para ayudar, y si además, enseño algo, ¡La satisfacción es doble!

Cualquier cosa, no dudes en comentarme, por aquí o en Dudas Access Foro

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas