【问题标题】:Group by in the case of data in the database and data when displaying inconsistenciesGroup by 在数据库中的数据和显示不一致时的数据的情况下
【发布时间】:2018-08-20 01:10:48
【问题描述】:

我有以下数据库

DriverC    Description     LiabilitiesC    Amount    Date
---------------------------------------------------------
D001       form A to B     0               10.00     8/3
D001       form A to B     1               20.00     9/3
D001       form A to B     1               20.00     10/3
D002       form C to D     1               30.00     11/3

LiabilitiesC 是一个有两个值的期权,即:0-Payment; 1-负债

我想要的显示界面如下

DriverC    Description     Liabilities     Payment    Date
-----------------------------------------------------------
D001       form A to B     40.00           10.00      8/3
D002       form C to D     30.00           0          11/3

代码分组如下

var list = (from l in liabilites.AsEnumerable()
                    group l by l.DriverC
                    into g
                    select new LiabilitiesViewModel()
                    {
                        DriverC = g.First().DriverC,
                        Description = g.First().Description,
                        LiabilitiesC = g.First().LiabilitiesC,
                        Amount = g.First().Amount,
                        Date = g.First().Date,
                    }).ToList();

如下分配数据

for (int i = 0; i < list.Count; i++)
            {
                row["DriverC"] = list[i].DriverC;
                row["Description"] = list[i].Description;
                row["Date"] = list[i].Date;
                if (list[i].LiabilitiesC == "0")
                {
                    row["Payment"] = list[i].Amount;
                    row["Liabilities"] = 0;
                }
                else
                {
                    row["Liabilities"] = list[x].Amount;
                    row["Payment"] = 0;
                }
            }

但是,结果并不像预期的那样

DriverC    Description     Liabilities     Payment    Date
-----------------------------------------------------------
D001       form A to B     40.00                      8/3
D002       form C to D     30.00                      11/3

在这种情况下有人帮助我,谢谢

【问题讨论】:

    标签: c# asp.net entity-framework linq group-by


    【解决方案1】:

    以下代码将对您有所帮助,

    var result = from a in liabilites
                 group a by a.DriverC into g             
                 select new {
                        DriverC = g.First().DriverC,
                        Description = g.First().Description,
                        Liabilities = g.Where(x=>x.LiabilitiesC == 1).Sum(a=>a.Amount)??0,
                        Payment = g.Where(x=>x.LiabilitiesC == 0).Sum(a=>a.Amount)??0,
                        Date = g.First().Date
                 };          
    Console.WriteLine(result);
    

    你可以使用Where来设置支付是0还是1的条件,然后你可以用Sum总结满足条件的Amount

    【讨论】:

    • 太好了,它给出了确切的结果,我投票给你,谢谢我的男人
    • 如果它对你有用,请接受它作为你的答案。
    【解决方案2】:

    试试这个

        void bind()
        {
    
            string str = "select Driverc,Description,case when Liabilitiesc=0 then 'Payment' else 'Liabilities' end as Type,Amount,Date from Yourtable name";
            SqlCommand cmd = new SqlCommand(str, con);
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            da.Fill(dt);
            if (dt.Rows.Count != 0)
            {
                ClintUsr.DataSource = dt;
                ClintUsr.DataBind();
             use for group which field you want-->   ShowingGroupingDataInGridView(Gridview1.Rows, 2, 1);
    
            }
            else
            {
                DataTable dt1 = new DataTable();
                dt1.Columns.Add(new DataColumn("Yourdatacolum names", typeof(string)));
    
                dt1.Rows.Add(dt1.NewRow());
                Gridview1.DataSource = dt1;
                Gridview1.DataBind();
    
            }
    
    
        }
    

    显示 GroupingDataInGridview

    void ShowingGroupingDataInGridView(GridViewRowCollection gridViewRows, int startIndex, int totalColumns)
        {
            if (totalColumns == 0) return;
            int i, count = 1;
            ArrayList lst = new ArrayList();
            lst.Add(gridViewRows[0]);
            var ctrl = gridViewRows[0].Cells[startIndex];
            for (i = 1; i < gridViewRows.Count; i++)
            {
                TableCell nextTbCell = gridViewRows[i].Cells[startIndex];
                if (ctrl.Text == nextTbCell.Text)
                {
                    count++;
                    nextTbCell.Visible = false;
                    lst.Add(gridViewRows[i]);
                }
                else
                {
                    if (count > 1)
                    {
                        ctrl.RowSpan = count;
                        ShowingGroupingDataInGridView(new GridViewRowCollection(lst), startIndex + 0, totalColumns - 1);
                    }
                    count = 1;
                    lst.Clear();
                    ctrl = gridViewRows[i].Cells[startIndex];
                    lst.Add(gridViewRows[i]);
                }
            }
            if (count > 1)
            {
                ctrl.RowSpan = count;
                ShowingGroupingDataInGridView(new GridViewRowCollection(lst), startIndex + 0, totalColumns - 1);
            }
            count = 1;
            lst.Clear();
        }
    

    【讨论】:

    • 感谢 Karthikeyan Nagaraj,另一个要求是对 DriverC 下的 Amount 列求和
    • 我需要的是这个问题的逻辑
    • 告诉你用了多少张表和表名也...我会改回帖
    • 感谢 Karthikeyan Nagaraj,Abhilash Ravindran C K 给了我正确的结果。无论如何,我也为你投票
    【解决方案3】:

    我不知道这是否有帮助,但您可以在一个简单的 SQL 查询中完成所有操作,如下所示:

    SELECT DriverC,
        Description,
        SUM(CASE WHEN LiabilitiesC = 1 THEN Amount ELSE 0 END) AS Liabilities,
        SUM(CASE WHEN LiabilitiesC = 0 THEN Amount ELSE 0 END) AS Payment,
        MIN(Date) AS Date
    FROM Liabilities
    GROUP BY DriverC, Description
    

    这还有一个好处是可以在 SQL 服务器上执行计算。

    【讨论】:

    • 感谢 Chris Carr,但这对我没有多大帮助,我也为你投票
    猜你喜欢
    • 2017-06-29
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多