Sql 统计数据表中的票据数量

Sql 统计数据表中的票据数量,sql,counting,Sql,Counting,DataTable包含两列BillId和BillValues。BillValue可以是任意数字(1到1000)。 我想计算DataTable上出现的5张账单、10张账单和所有其他账单的总数,并将它们添加到字典中。在这方面,请告知 BillId , BillValue 1 5 1 10 1 10 1 5 1 20 1 5 1 4 1 10 就像@jarl

DataTable包含两列BillId和BillValues。BillValue可以是任意数字(1到1000)。 我想计算DataTable上出现的5张账单、10张账单和所有其他账单的总数,并将它们添加到字典中。在这方面,请告知

BillId , BillValue
1          5
1          10
1          10
1          5
1          20
1          5
1          4
1          10

就像@jarlh已经说过的那样,使用group by可以达到目的

DECLARE @t TABLE (BillID INT, BillValue INT)
INSERT INTO @t VALUES
(1,5),
(1,10),
(1,10),
(1,5),
(1,20),
(1,5),
(1,4),
(1,10)

SELECT BillID, BillValue, COUNT(BillId) AS n
FROM    @t
GROUP BY BillID, BillValue
结果

BillId  BillValue  n
--------------------
1       4          1
1       5          3
1       10         3
1       20         1
如果您正在寻找C#解决方案

DataTable dt=newdatatable();
//假设您先填充数据表
Dictionary billCounter=新字典();
foreach(数据行dr在dt.行中)
{
int bill=int.Parse(dr[“BillValue”].ToString());
if(billCounter.ContainsKey(账单))
票据计数器[票据]+;
其他的
票据柜。添加(票据,1);
}
//票据计数器由唯一的计数器填充

提示:
分组依据
!分组后,我怎样才能知道5出现了多少次,10出现了多少次,4出现了多少次等等,这些都是dbms处理的。根本没有理由为了计数而将数据从db移动到c#。(此外,我们不知道OP是否使用c。)是的,但当我看到问题时,它有c标记,所以只是一个想法:-)。第一个答案更合适,让Db来处理所有这些。使用下面的语句将datatable转换为Dictionary var bills=dt.AsEnumerable().ToDictionary(r=>r.Field(0),r=>r.Field(1));
        DataTable dt = new DataTable();
        // Assuming you fill Datatable first
        Dictionary<int, int> billCounter = new Dictionary<int, int>();
        foreach(DataRow dr in dt.Rows)
        {
            int bill = int.Parse(dr["BillValue"].ToString());
            if (billCounter.ContainsKey(bill))
                billCounter[bill]++;
            else
                billCounter.Add(bill, 1);
        }
        // bill counter is filled with unique counters