如何从某些行求和
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中显示。”是什么意思? 无法启用约束。一行或多行包含违反非空、唯一或外键约束的值。 问题纯粹是因为您使用的是>
和<
吗?没有date
值大于 20210217
和 小于 20210218
。你真的应该使用>=
广告<=
吗?你所拥有的类似于要求一个介于 3 和 4 之间的整数值,不包括 3 和 4。这两个数字之间没有其他整数。
如果我们做将您的表达式更改为>=
和<=
,则数据集可以正常工作: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());
【讨论】:
以上是关于如何从某些行求和的主要内容,如果未能解决你的问题,请参考以下文章