Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   .NET (http://www.forosdelweb.com/f29/)
-   -   Agrupar filas por meses en un DataTable (http://www.forosdelweb.com/f29/agrupar-filas-por-meses-datatable-299734/)

Bravenap 19/05/2005 10:05

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.

DotNetDeveloper 19/05/2005 10:15

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)))

Bravenap 19/05/2005 10:27

mmmmmm.....

Me dice que hay un error de sintaxis en la coma.

RootK 19/05/2005 10:29

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

Bravenap 19/05/2005 10:36

:'( 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.

Bravenap 19/05/2005 10:37

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.

Bravenap 19/05/2005 10:55

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.

Bravenap 24/05/2005 07:59

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.


La zona horaria es GMT -6. Ahora son las 09:51.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.