如何从某些行求和

Posted

技术标签:

【中文标题】如何从某些行求和【英文标题】:How to sum from certain rows 【发布时间】:2021-02-18 12:04:10 【问题描述】:

我正在尝试显示特定日期内售出的商品数量。 销售明细数据看起来是这样的

SalesID DetailID Items Quantity salesDate
0 0 noodles 1 17/02/2021
0 1 burger 1 17/02/2021
0 2 salad 1 17/02/2021
1 3 fries 1 18/02/2021
2 4 noodles 1 18/02/2021
2 5 noodles 1 18/02/2021
3 6 fries 1 19/02/2021
4 7 noodles 1 19/02/2021
5 8 noodles 1 20/02/2021

它是从其他表中加入的,基本上和上面一样。 最终商品销售表将搜索 [userInputDate1] 和 [userInputDate2] 之间的条目并简化它。 这是用户输入 17/02/21 和 18/02/21 时应该显示的内容。

Items ItemsSold
noodles 3
burger 1
salad 1
salad 1

我试过 linq 查询

SELECT        Items, SUM(Quantity) AS TQuantity
FROM            PosView
WHERE        (salesDate > @userInputDate1) AND (salesDate < @userInputDate2)
GROUP BY Items

但它不会显示在 datagridview 中。

如果我找不到更简单的解决方案,我将使用 for /foreach 以编程方式计算 datagridview 中的项目

【问题讨论】:

你拥有的SQL最简单的解决方案。 “它不会在datagridview中显示。”是什么意思? 无法启用约束。一行或多行包含违反非空、唯一或外键约束的值。 问题纯粹是因为您使用的是&gt;&lt;吗?没有date大于 20210217 小于 20210218。你真的应该使用&gt;= 广告&lt;= 吗?你所拥有的类似于要求一个介于 3 和 4 之间的整数值,不包括 3 和 4。这两个数字之间没有其他整数。 如果我们将您的表达式更改为&gt;=&lt;=,则数据集可以正常工作:db<>fiddle。 那么这就是您应该在问题中提出的问题。包含错误,并修复您的 SQL。 【参考方案1】:

见下文:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.IO;
using System.Globalization;
namespace ConsoleApplication181

    class Program
    
        static void Main(string[] args)
        
            DataTable dt = new DataTable();
            dt.Columns.Add("SalesID", typeof(int));
            dt.Columns.Add("DetailID", typeof(int));
            dt.Columns.Add("Items", typeof(string));
            dt.Columns.Add("Quantity", typeof(int));
            dt.Columns.Add("salesDate", typeof(DateTime));

            dt.Rows.Add(new object[] 0, 0, "noodles",1, DateTime.ParseExact("17/02/2021", "dd/mm/yyyy", CultureInfo.InvariantCulture));
            dt.Rows.Add(new object[] 0, 1, "burger",1, DateTime.ParseExact("17/02/2021", "dd/mm/yyyy", CultureInfo.InvariantCulture));
            dt.Rows.Add(new object[] 0, 2, "salad",1, DateTime.ParseExact("17/02/2021", "dd/mm/yyyy", CultureInfo.InvariantCulture));
            dt.Rows.Add(new object[] 1, 3, "fries",1, DateTime.ParseExact("18/02/2021", "dd/mm/yyyy", CultureInfo.InvariantCulture));
            dt.Rows.Add(new object[] 2, 4, "noodles",1, DateTime.ParseExact("18/02/2021", "dd/mm/yyyy", CultureInfo.InvariantCulture));
            dt.Rows.Add(new object[] 2, 5, "noodles",1, DateTime.ParseExact("18/02/2021", "dd/mm/yyyy", CultureInfo.InvariantCulture));
            dt.Rows.Add(new object[] 3, 6, "fries",1, DateTime.ParseExact("19/02/2021", "dd/mm/yyyy", CultureInfo.InvariantCulture));
            dt.Rows.Add(new object[] 4, 7, "noodles",1, DateTime.ParseExact("19/02/2021", "dd/mm/yyyy", CultureInfo.InvariantCulture));
            dt.Rows.Add(new object[] 5, 8, "noodles",1, DateTime.ParseExact("20/02/2021", "dd/mm/yyyy", CultureInfo.InvariantCulture));

            DataTable dt2 = new DataTable();
            dt2.Columns.Add("Items", typeof(string));
            dt2.Columns.Add("ItemsSold", typeof(int));

            var groups = dt.AsEnumerable().GroupBy(x => x.Field<string>("Items")).ToList();

            foreach (var group in groups)
            
                dt2.Rows.Add(new object[] group.Key, group.Count());
            

        
 
    
 

【讨论】:

以上是关于如何从某些行求和的主要内容,如果未能解决你的问题,请参考以下文章

如何对数据框中某些列和行的数据求和?

如何从表中删除某些行?

如何从包含日期时间列的表中获取某些行和“先前”行?

如何从数据框列的某些行中删除字符?

如何根据多个条件对行求和 - R? [复制]

如何在 MySQL 中对行进行求和