Foros del Web » Programación para mayores de 30 ;) » .NET »

Agrupar filas por meses en un DataTable

Estas en el tema de Agrupar filas por meses en un DataTable en el foro de .NET en Foros del Web. Muy buenas de nuevo. Sigo dándole vueltas al mismo rollo de toquetear los DataTable. Bien, una vez conseguida una tabla con estos campos: Fecha, Factura ...
  #1 (permalink)  
Antiguo 19/05/2005, 10:05
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 6 meses
Puntos: 4
Agrupar filas por meses en un DataTable

Muy buenas de nuevo. Sigo dándole vueltas al mismo rollo de toquetear los DataTable. Bien, una vez conseguida una tabla con estos campos: Fecha, Factura e Importe me gustaría obtener otra en la que apareciera la suma de importes de cada mes. He probado directamente con esta cadena de selección de la base de datos:

Código:
SELECT Sum(Importe) FROM Tabla GROUP BY MONTH(CDATE(Fecha))
Y obtengo una fila para cada mes pero me agrupa los todos los meses iguales sin hacer distinción entre el año, es decir, suma todas las facturas de los meses de enero de 2000, 2001, .... dando una sola fila.

Esto otro no resultó

Código:
SELECT Sum(Importe) FROM Tabla GROUP BY (MONTH(CDATE(Fecha)) AND YEAR(CDATE(Fecha)))
Me devuelve una suma de todo.

Podría utilizar un filtro de la DataTable o DataView pero con el tema de las fechas es muy tedioso, pues, entre otras cosas no puedo usar la función Month() en el filtro.

¿Alguna idea?

Gracias y un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #2 (permalink)  
Antiguo 19/05/2005, 10:15
 
Fecha de Ingreso: abril-2003
Mensajes: 606
Antigüedad: 21 años, 1 mes
Puntos: 2
Pues tu idea en la consulta esta bien, lo que no se es si funcione, hasta donde yo se debería ser así:

SELECT Sum(Importe) FROM Tabla GROUP BY (MONTH(CDATE(Fecha)), YEAR(CDATE(Fecha)))
  #3 (permalink)  
Antiguo 19/05/2005, 10:27
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 6 meses
Puntos: 4
mmmmmm.....

Me dice que hay un error de sintaxis en la coma.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #4 (permalink)  
Antiguo 19/05/2005, 10:29
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 3 meses
Puntos: 50
Que BD estas usando ? porque si es MSSQL solo basta con que lo hagas así: (sin el CDate)

Cita:
select Sum(Importe)
from Tabla
group by month(Fecha)
Salu2
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #5 (permalink)  
Antiguo 19/05/2005, 10:36
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 6 meses
Puntos: 4
no, estoy utilizando Access.

He cambiado la coma por un & y ya va bien, aunque tengo algunos otros problemillas. A ver si lo completo y lo pongo.

Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #6 (permalink)  
Antiguo 19/05/2005, 10:37
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 6 meses
Puntos: 4
Se me olvidaba, tengo que usar CDate porque el campo es de texto, no de tipo fecha. Esto no lo puedo cambiar así que tengo que hacer obligatoriamente la conversión antes.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #7 (permalink)  
Antiguo 19/05/2005, 10:55
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 6 meses
Puntos: 4
Bueno, pues ya está. Tengo que aplicar la función MAX(), aunque vale otra parecida, para que agrupe bien, puesto que no es suma ni cuenta. Os dejo el código completo:

Código:
strSel = "SELECT CSTR(MAX(MONTH(CDATE(FechaVisado)))) AS Mes, MAX(YEAR(CDATE(FechaVisado))) AS Año, COUNT(NumVisado) AS Visados, SUM(CDBL(CDBL(DerechosVisado)+CDBL(Legalizacion))) AS Importe FROM " & TablaBDInicial & " GROUP BY (MONTH(CDATE(FechaVisado)) & YEAR(CDATE(FechaVisado)))"
            Dim daResumen As New OleDbDataAdapter(strSel, con)
            Dim dtResumen As New DataTable
            daResumen.Fill(dtResumen)
            For Each f As DataRow In dtResumen.Rows
                f("Mes") = meses(Int16.Parse(f("Mes")) - 1) 'cambia el número de mes por el nombre del mes
            Next
            Dim dvResumen As New DataView(dtResumen)
            dvResumen.Sort = "Año, Mes"
            Me.dgInforme.DataSource = dvResumen
Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #8 (permalink)  
Antiguo 24/05/2005, 07:59
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 6 meses
Puntos: 4
De vuelta con estos lios de tablas, una cuestión. Una vez obtenido un DataView al que se le aplica un orden de filas, me gustaría crear una nueva tabla que mentuviera ese orden. Estoy intentando esto, pero salta error en la línea roja. Dice que la fila ya pertenece a otra tabla:

Código:
            strSel = "SELECT CSTR(MAX(MONTH(CDATE(FechaVisado)))) AS Mes, MAX(YEAR(CDATE(FechaVisado))) AS Año, COUNT(NumVisado) AS Visados, SUM(CDBL(CDBL(DerechosVisado)+CDBL(Legalizacion))) AS Importe FROM " & TablaBDInicial
            strSel += " WHERE " & filtroFechas.ToString & filtroLega.ToString
            strSel += " GROUP BY (MONTH(CDATE(FechaVisado)) & YEAR(CDATE(FechaVisado)))"
            Dim daResumen As New OleDbDataAdapter(strSel, con)
            Dim dtResumen As New DataTable
            daResumen.Fill(dtResumen)
            For Each f As DataRow In dtResumen.Rows
                f("Mes") = meses(Int16.Parse(f("Mes")) - 1)
            Next
            Dim dvResumen As New DataView(dtResumen)
            dvResumen.Sort = "Año, Mes"
            Me.dgInforme.DataSource = dvResumen

            Dim dtOrdenada As DataTable
            dtOrdenada = dtResumen.Clone
            For i As Integer = 0 To dvResumen.Count - 1
                Dim nFila As DataRow = dtOrdenada.NewRow
                nFila = dvResumen.Item(i).Row
                Try
                    dtOrdenada.Rows.Add(nFila)
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            Next
            ds.Tables.Clear()
            ds.Tables.Add(dtOrdenada)
Gracias de nuevo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:30.