¿Es posible seleccionar la suma de una columna, agrupando por otra columna?

Formato de tabla:

Date   |   NumberIWantToSum   |   ID(PK)   |   ForeignKeyID

Para un ForeignKeyID dado, quiero sumar todos los valores NumberIWantToSum que tienen la misma fecha, usando Linq2SQL y luego completar una lista de mi propia clase personalizada con todo el valor de la fila.

¿Es esto posible?

Entonces, dados los valores:

    Date   |   NumberIWantToSum   |   ID(PK)   |   ForeignKeyID
   1/1/1             1                  123              2
   1/1/1             12                 124              2
   1/1/1             44                 125              3
   1/1/2             14                 126              2

Me dan el parámetro para ForeignKeyID para este método, supongamos que es 2, por lo que este método debería devolver las filas:

   1/1/1             13                 123              2
   1/1/2             14                 126              2

Mi intento de hacer esto:

(from o in context.table.Where(r => r.GroupByThisColID == GroupByThisColID)
 select new CustomClass()
 {
     ID = o.ID,
     Date = o.Date,
     NumberIWantToSum = o.NumberIWantToSum,
     ForeignKeyID  = o.ForeignKeyID
 }).ToList();

Sin embargo, esto no suma los valores de NumberIWantToSum y los combina en una fila.

¿Cómo debo hacer esto?

preguntado el 02 de julio de 12 a las 14:07

El campo ID: está incluido en los resultados esperados, pero no en el grupo por (o un MIN/MAX/etc). Entonces, ¿cómo sabría elegir 123 y no 124? ¿Falta algo ahí...? -

Tal vez me estoy perdiendo algo, pero ¿no debería un grupo con 2 producir 1+12+14? -

Tampoco estoy seguro de cómo manejar esto; no debería importar cuál se devuelve para esta columna (ya que cualquiera de los dos sería único). ¿Alguna sugerencia sobre cómo manejar esto? -

@JustinPihony: no, ya que el 44 tiene un GroupByThisColID de 3, mientras que el resto tiene 2. Solo deseo devolver los valores donde GroupByThisColID es 2 (o cualquiera que sea el parámetro pasado). -

No soy un experto en LINQ, pero en TSQL su 2 es un parámetro DONDE, y la FECHA es la columna Agrupar por. Sin embargo, debe indicarle qué hacer con el campo ID, de lo contrario, devolverá una fila para cada valor único aquí, por lo que no sumará nada. -

3 Respuestas

Basado en tu explicación GroupByThisColdID se utiliza para filtrar, no para agrupar. De hecho, desea agrupar por fecha.

Prueba esto:

var query = from o in context.table
            where o.GroupByThisColID == GroupByThisColID
            group o by o.Date into grouping
            select new CustomClass()
            {
                ID = grouping.First().ID,
                Date = grouping.Key,
                SummedNumbers = grouping.Sum(g => g.NumberIWantToSum),
                GroupByThisColID  = grouping.First().GroupByThisColID
            };

Usar grouping.First().ID devolverá el primer ID, aunque pueden ser diferentes. Esto sería "123" en sus datos de muestra.

Respondido 02 Jul 12, 14:07

var r = from x in table
        group x by x.GroupByThisColID into g
        select new
        {
            Key = g.Key,
            Sum = g.Sum(i => i.NumberIWantToSum)
        };

foreach (var x in r)
{
    var key = x.Key;
    var sum = x.Sum;
}

Respondido 02 Jul 12, 14:07

var results = context.table.GroupBy( t=> t.GroupByThisColID)
    .Select( g => new CustomClass()
        {
            GroupByThisColID = g.Key,
            ColumnSum = g.Sum( p => p.NumberIWantToSum)
        });

Respondido 02 Jul 12, 14:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.