根据条件求和

Raysefo

知名会员
已加入
2019年2月22日
留言内容
192
编程经验
10+
嗨,您好,

我有一个控制台应用程序,正在从数据库中获取结果。我想总结一下 单价 总价 通过将的第3和第4个字符分组 shopNo(第二列: 98184487 )。有可行的方法吗?

这是查询结果示例:
C#:
referenceid      shopno      safeno    cashierno    purchaseStatusDate    confirmcanceldatetime    productcode    productdescription    quantity    unitprice    totalprice    status
031A482E-6C02-419D-B8A1-0F145DA2F079    98184487    3    9027765    2020-04-01 14:23:00.000    2020-04-01 14:24:23.733    000000001573    Bim 840 Riot Points    1    32    32    2
ED4AE4C3-5A80-49E3-AD81-1BC20C86C302    96174860    1    167834    2020-04-01 19:42:28.850    2020-04-01 19:42:36.887    000000001585    2100 ZA    1    5    5    1
9D6ECB8E-3080-44EB-8155-1EE11064C506    96173728    1    194044    2020-04-01 14:24:22.000    NULL    000000001573    Bim 840 Riot Points    1    32    32    0
2D87E61E-3281-46BC-A433-247B683D5715    98184487    3    9027765    2020-04-01 14:16:35.000    2020-04-01 14:17:26.260    000000001570    10 TL'lik Steam Bakiyesi    1    10    10    1
AD7E534A-7084-4B9F-B2DD-24F2483B703B    96113528    1    176849    2020-04-01 13:47:41.047    2020-04-01 13:47:48.960    000000001570    10 TL'lik Steam Bakiyesi    1    10    10    1
36B30CCD-B843-44C1-AEA2-283625D4ECD0    98104487    3    9027765    2020-04-01 14:22:04.543    2020-04-01 14:22:23.940    000000001585    2100 ZA    1    5    5    1
721E9139-7D25-4753-8AA9-36356DF2CE08    96173761    1    150578    2020-04-01 17:44:55.000    2020-04-01 17:44:55.787    000000001570    10 TL'lik Steam Bakiyesi    1    10    10    1
F9143D45-40BF-4471-8579-391947BA1D7D    97114860    2    9026698    2020-04-01 16:19:24.000    2020-04-01 16:19:19.427    000000001570    10 TL'lik Steam Bakiyesi    1    10    10    1
D992C1FC-4CC5-42D1-8176-3D1C89018EF2    97174860    2    9026698    2020-04-01 16:17:51.000    2020-04-01 16:17:46.613    000000001570    10 TL'lik Steam Bakiyesi    1    10    10    1
8B52A941-4F5E-41BE-A9EB-4059BF09F794    96101615    1    133109    2020-04-01 16:51:25.957    2020-04-01 16:51:37.163    000000001585    2100 ZA    1    5    5    1
1DF20FEB-6921-4010-B8B1-445EB8A314AC    96173528    1    176849    2020-04-01 13:48:24.000    2020-04-01 13:48:22.310    000000001570    10 TL'lik Steam Bakiyesi    1    10    10    1

最好的祝福。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,502
地点
悉尼,澳大利亚
编程经验
10+
您要使用SQL还是C#进行聚合?如果使用SQL,则需要知道哪个数据库,以确保获得用于处理文本值的正确语法。另外,我能证明这一点吗 shopno 列是文本而不是数字?
 

Raysefo

知名会员
已加入
2019年2月22日
留言内容
192
编程经验
10+
实际上,我在SQL论坛中也曾尝试并提出过要求,但我认为使用SQL查询很难实现。因此,在C#中,我想为此实现一个方便的解决方案。顺便说一下,ShopNo是文本。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,502
地点
悉尼,澳大利亚
编程经验
10+
我认为这在SQL中会更容易,例如对于SQL Server:
C#:
SELECT SUBSTRING(shopno, 3, 2) AS   shopno  Substring, SUM(unitPrice) AS  单价 Sum, SUM(totalPrice) AS 总价Sum
FROM myTable
GROUP BY SUBSTRING(shopno, 3, 2)
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,502
地点
悉尼,澳大利亚
编程经验
10+
但是我想要亩解决方案中的所有其他列  :)
您显然不了解分组的工作原理。考虑以下两行:
C#:
031A482E-6C02-419D-B8A1-0F145DA2F079  98184487  3  9027765  2020-04-01 14:23:00.000  2020-04-01 14:24:23.733  000000001573  Bim 840 Riot Points       1  32  32  2
2D87E61E-3281-46BC-A433-247B683D5715  98184487  3  9027765  2020-04-01 14:16:35.000  2020-04-01 14:17:26.260  000000001570  10 TL'lik Steam Bakiyesi  1  10  10  1
根据您的原始问题,应将这两行合并为一行,然后将 单价 总价 列汇总。您期望其余各列发生什么变化?其中有些具有相同的值,但有些具有不同的值,那么您如何准确地认为与原始两行不同的值应合并为最后一行中的单个值?
 

Raysefo

知名会员
已加入
2019年2月22日
留言内容
192
编程经验
10+
C#:
031A482E-6C02-419D-B8A1-0F145DA2F079  98184487  3  9027765  2020-04-01 14:23:00.000  2020-04-01 14:24:23.733  000000001573  Bim 840 Riot Points       1  32  32  2
2D87E61E-3281-46BC-A433-247B683D5715  98184487  3  9027765  2020-04-01 14:16:35.000  2020-04-01 14:17:26.260  000000001570  10 TL'lik Steam Bakiyesi  1  10  10  1
[B]TotalPrice: 42 (32+10)[/B]
这就是为什么我试图在C#中实现它。基本上,我想根据shopNo第3和第4个字符对结果进行分组并对其价格求和。然后,也许我要把它们写到文件中或发送一封电子邮件,这不是本讨论的主题。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,502
地点
悉尼,澳大利亚
编程经验
10+
也许您应该预先对问题进行全面而清晰的解释,所以我们知道我们实际上要问什么,而不会浪费时间提供其他信息。您将使用LINQ查询最有效地做到这一点,但我不愿意立即解决。现在是凌晨3:30,我很少在LINQ中使用分组功能,所以我不得不考虑一下并进行一些测试。我现在太累了。如果到我重新上网时还没有其他人做,那我就会有一个。
 

Raysefo

知名会员
已加入
2019年2月22日
留言内容
192
编程经验
10+
全文是,一个客户希望我将每日对帐(类似于我的第一篇文章中的上述结果)写入文件中。现在他要我根据shopNO在该文件中添加小计。 (第3和第4个字符标识了区域)谢谢,我也感谢您的努力。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
但是我想要解决方案中的所有其他列  :)
在您的开幕主题中提到的内容又没有什么关系,为什么您现在只提到它?
您显然不了解分组的工作原理。考虑以下两行:
C#:
031A482E-6C02-419D-B8A1-0F145DA2F079  98184487  3  9027765  2020-04-01 14:23:00.000  2020-04-01 14:24:23.733  000000001573  Bim 840 Riot Points       1  32  32  2
2D87E61E-3281-46BC-A433-247B683D5715  98184487  3  9027765  2020-04-01 14:16:35.000  2020-04-01 14:17:26.260  000000001570  10 TL'lik Steam Bakiyesi  1  10  10  1
根据您的原始问题,应将这两行合并为一行,然后将 单价 总价 列汇总。您期望其余各列发生什么变化?其中有些具有相同的值,但有些具有不同的值,那么您如何准确地认为与原始两行不同的值应合并为最后一行中的单个值?
我不确定JM是否误解了您的问题(我也是),因为您含糊其词。在第9个帖子中,您仍然不清楚自己的目标,我认为那是因为您不了解客户的要求。如果您确实了解客户的指示。您在帮助我们方面无济于事。尽力解释您正在尝试和想要做的事情。
现在是凌晨3:30,我很少在LINQ中使用分组功能,所以我不得不考虑一下并进行一些测试。
快点睡觉吧,JM,这些深夜一定会赶上我们的,相信我,正如我最近发现的那样,它们很容易破坏您的健康。

@raysefo 在SQL中这样做会更容易。如果您的客户允许您修改数据库,那么通过允许您拥有一个可以选择要进入的字段的表,对他有帮助。即SELECT INTO,并使用Linq作为过滤器,通过从新表中选择相关数据来结束查询。完成后,您可以随时删除不再需要的数据。如果那不是您的客户所允许的,那么您正在考虑通过两个Linq查询来实现。抱歉,但我目前也无法为您写出来。
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,028
地点
挪威
编程经验
10+
一个带有强类型数据表的linq示例,可以循环结果“组”,并且可以循环每个组的行。如果要按组分组,也可以使用ToDictionary。
C#:
var groups = from row in table.AsEnumerable()
             group row by row.shopno.Substring(2, 2) into g
             select new { g.Key, Rows = g.ToList(), Total = g.Sum(item => item.totalprice) };
 

Raysefo

知名会员
已加入
2019年2月22日
留言内容
192
编程经验
10+
谢谢 @约翰·H ,如何在控制台应用程序中使用它?

C#:
class Test
    {
        static readonly log4net.ILog log =
            log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        static void Main(string[] args)
        {
            try
            {

                //Declarations
                DateTime runday = DateTime.Today;
                string status = null;
                string myFileName = String.Format("{0}__{1}", DateTime.Now.ToString("ddMMyyyy"), "ReconFile.txt");
                //DEV
                string myFullPath = Path.Combine("T:\\ReconLogFiles\\", myFileName);
                

                if (args.Length > 0)
                {
                    Console.WriteLine(args[0].ToString());
                    runday = DateTime.Parse(args[0].ToString());
                }

                // Create the connection to the resource!
                // This is the connection, that is established  和 
                // will be available throughout this block.
                using (var conn = new SqlConnection())
                {
                    // Create the connectionString
                    //DEV
                    conn.ConnectionString =
                        "Server=(localdb)\\MSSQLLocalDB; Initial Catalog=TEST; Integrated Security=True; MultipleActiveResultSets=True; Trusted_Connection=yes;";
                    conn.Open();
                    
                    
                   var command = new SqlCommand(
                        "SELECT cf.referenceid, ISNULL(cc.shopno,gr.shopNo) AS   shopno  , ISNULL(cc.safeno,gr.safeNo) AS safeno, ISNULL(cc.cashierno, gr.cashierNo) AS cashierno, cf.purchaseStatusDate, cc.confirmcanceldatetime, cf.productcode, cf.productdescription, cf.quantity, cf.unitprice, cf.totalprice, ISNULL(cc.status, 0) As status FROM[gameconfirmresponses] cf LEFT JOIN(SELECT *, Row_number() OVER(partition BY referenceid ORDER BY confirmcanceldatetime) AS row_num FROM[confirmcancels]) AS cc ON cf.referenceid = cc.referenceid AND cc.row_num = 1 JOIN[GameRequests] AS gr ON gr.referenceId = cf.referenceId WHERE cf.purchasestatusdate >= @Today AND cf.purchasestatusdate < DATEADD(day,1,@Today)",
                        conn);
                      
                    // Add the parameters.
                    command.Parameters.Add(new SqlParameter("Today", runday));

                  
                    using (var reader = command.ExecuteReader())
                    {
                        
                        while (reader.Read())
                        {

                            Console.WriteLine(
                                $"{reader[0]} \t | {reader[1]} \t | {reader[2]} \t | {reader[3]} \t | {reader[4]} \t | {reader[5]} \t | {reader[6]} \t | {reader[7]} \t | {reader[8]} \t | {reader[9]} \t | {reader[10]} \t | {reader[11]}");

                            if (reader.GetInt32(11) == 0)
                            {
                                status = "Uncertain";
                            }
                            else if (reader.GetInt32(11) == 1)
                            {
                                status = "Confirm";
                            }
                            else
                            {
                                status = "Cancel";
                            }

                            log.Info(
                                $"{reader[0]};{reader[1]};{reader[2]};{reader[3]};{reader[4]};{reader[5]};{reader[6]};{reader[7]};{reader[8]};{reader[9]};{reader[10]}" +
                                ";" + status);

                            // Append text to an existing file.
                            using (StreamWriter outputFile = new StreamWriter(myFullPath, true))
                            {
                                outputFile.WriteLine(
                                    $"{reader[0]};{reader[1]};{reader[2]};{reader[3]};{reader[4]};{reader[5]};{reader[6]};{reader[7]};{reader[8]};{reader[9]};{reader[10]}" +
                                    ";" + status);
                            }

                            Console.WriteLine("Done! Press enter to move to the next step");
                        }

                        //No Purchase
                        if (!reader.HasRows)
                        {
                            using (StreamWriter outputFile = new StreamWriter(myFullPath, false))
                            {
                            }
                        }
                    }

                    Console.WriteLine("Data displayed! Now press enter to move to the next section!");
                }
            }
            catch (Exception ex)
            {
                log.Error("Error Message: " + ex.Message.ToString(), ex);
            }
        }
    }
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
但是我想要解决方案中的所有其他列  :)
为了回应其他人说的话,那么这两个列值的总和是多少?
C#:
Bim 840 Riot Points
10 TL'lik Steam Bakiyesi

我认为您需要考虑自己的要求和/或所做的事情。
 

Raysefo

知名会员
已加入
2019年2月22日
留言内容
192
编程经验
10+
这是我想要的结果;
C#:
2a5a27ae-d6da-4bd0-8508-d0a5606708e0;98004487;CENK;CENK;5.04.2020 09:31:51;;000000001585;ZULA;1;5;5;Uncertain
Subtotal: 5
b6a1683c-82aa-47dc-b2e4-0b54be5fb3c4;98154487;22;33;5.04.2020 15:53:16;5.04.2020 15:53:21;000000001572;Bim 400 Riot Points;1;12;12;Confirm
Subtotal: 12
6d7ee122-8a73-464f-be2a-18ef9133e77d;98164487;22;33;5.04.2020 15:54:26;5.04.2020 15:54:28;000000001574;25 Hükümdarlık;1;6;6;Confirm
6ea82dbd-f82f-40e7-9d91-ddef42fb6c09;98164487;CENK;CENK;5.04.2020 15:54:15;;000000001573;Bim 840 Riot Points;1;24;24;Uncertain
Subtotal: 30
2ffb3e5e-bff4-4595-bdf5-b6e34902de58;98174487;22;33;5.04.2020 15:56:46;5.04.2020 15:56:56;000000001570;10 TL'lik Steam Bakiyesi;1;10;10;Confirm
1e0f954e-b589-44e1-9956-22cf89fbf864;98174487;22;33;5.04.2020 15:55:14;5.04.2020 15:56:08;000000001575;50 Hükümdarlık;1;12;12;Cancel
Subtotal: 22
68151ed5-28db-4ade-aae1-428562f38fad;98204487;CENK;CENK;5.04.2020 09:32:07;;000000001585;ZULA;1;5;5;Uncertain
Subtotal: 5
16b539f0-a908-4f4e-b8b8-b05f8cba0191;98404487;22;33;5.04.2020 15:53:48;5.04.2020 15:53:49;000000001573;Bim 840 Riot Points;1;24;24;Confirm
Subtotal: 24
Grand total: 98

这是我做的事;
C#:
class Program
    {
        static readonly log4net.ILog log =
            log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        static void Main(string[] args)
        {
            try
            {

                //Declarations
                DateTime runday = DateTime.Today;
                string status = null;
                string myFileName = String.Format("{0}__{1}", DateTime.Now.ToString("ddMMyyyy"), "RegionalReconFile.txt");
                //DEV
                string myFullPath = Path.Combine("T:\\ReconLogFiles\\", myFileName);
                
                if (args.Length > 0)
                {
                    Console.WriteLine(args[0].ToString());
                    runday = DateTime.Parse(args[0].ToString());
                }

                using (var conn = new SqlConnection())
                {
                    // Create the connectionString
                    
                    //DEV
                    conn.ConnectionString =
                        "Server=(localdb)\\MSSQLLocalDB; Initial Catalog=TestAPI; Integrated Security=True; MultipleActiveResultSets=True; Trusted_Connection=yes;";
                    
                    conn.Open();
                  
                    var command = new SqlCommand(
                        "SELECT cf.referenceid, ISNULL(cc.shopno,gr.shopNo) AS   shopno  , ISNULL(cc.safeno,gr.safeNo) AS safeno,ISNULL(cc.cashierno, gr.cashierNo) AS cashierno, cf.purchaseStatusDate, cc.confirmcanceldatetime, cf.productcode, cf.productdescription, cf.quantity, cf.unitprice, cf.totalprice,ISNULL(cc.status, 0) As status, substring(ISNULL([cc].[shopNo], [gr].[shopNo]), 3, 2) as shop FROM[gameconfirmresponses] cf LEFT JOIN(SELECT *, Row_number() OVER(partition BY referenceid ORDER BY confirmcanceldatetime) AS row_num FROM[confirmcancels]) AS cc ON cf.referenceid = cc.referenceid AND cc.row_num = 1 JOIN[GameRequests] AS gr ON gr.referenceId = cf.referenceId WHERE cf.purchasestatusdate >= @Today AND cf.purchasestatusdate < DATEADD(day,1,@Today) order by substring(ISNULL([cc].[shopNo], [gr].[shopNo]),3,2) asc", conn);
                    // Add the parameters.

                    command.Parameters.Add(new SqlParameter("Today", runday));

                    var shop = "";
                    var total = 0.0;
                    var count = 0;
                    var grandTotal = 0.0;
                    using (var reader = command.ExecuteReader())
                    {
                      
                        while (reader.Read())
                        {

                            Console.WriteLine(
                                $"{reader[0]} \t | {reader[1]} \t | {reader[2]} \t | {reader[3]} \t | {reader[4]} \t | {reader[5]} \t | {reader[6]} \t | {reader[7]} \t | {reader[8]} \t | {reader[9]} \t | {reader[10]} \t | {reader[11]} \t | {reader[12]}");

                            if (reader.GetInt32(11) == 0)
                            {
                                status = "Uncertain";
                            }
                            else if (reader.GetInt32(11) == 1)
                            {
                                status = "Confirm";
                            }
                            else
                            {
                                status = "Cancel";
                            }

                           log.Info(
                                $"{reader[0]};{reader[1]};{reader[2]};{reader[3]};{reader[4]};{reader[5]};{reader[6]};{reader[7]};{reader[8]};{reader[9]};{reader[10]}" +
                                ";" + status);

                            // Append text to an existing file.
                            using (StreamWriter outputFile = new StreamWriter(myFullPath, true))
                            {
                              
                              
                               if (shop != reader.GetString(12))
                               {
                                   shop = reader.GetString(12);

                                   if (count > 0 )
                                   {
                                       outputFile.WriteLine(
                                           $"Subtotal: " + total);
                                       grandTotal += total;
                                       total = 0.0;
                                       outputFile.WriteLine(
                                           $"{reader[0]};{reader[1]};{reader[2]};{reader[3]};{reader[4]};{reader[5]};{reader[6]};{reader[7]};{reader[8]};{reader[9]};{reader[10]}" +
                                           ";" + status);
                                    }
                                   else
                                   {
                                       outputFile.WriteLine(
                                           $"{reader[0]};{reader[1]};{reader[2]};{reader[3]};{reader[4]};{reader[5]};{reader[6]};{reader[7]};{reader[8]};{reader[9]};{reader[10]}" +
                                           ";" + status);
                                    }

                                }
                               else
                               {
                                   outputFile.WriteLine(
                                       $"{reader[0]};{reader[1]};{reader[2]};{reader[3]};{reader[4]};{reader[5]};{reader[6]};{reader[7]};{reader[8]};{reader[9]};{reader[10]}" +
                                       ";" + status);
                                  
                                }
                              
                            }
                            //Sum
                            total = total + reader.GetDouble(10);
                            count++;

                            Console.WriteLine("Done! Press enter to move to the next step");
                        }
                        //Last subtotal  和  grand total
                        
                        using (StreamWriter sw = File.AppendText(myFullPath))
                        {
                            sw.WriteLine($"Subtotal: " + total);
                            grandTotal += total;
                            sw.WriteLine($"Grand total: " + grandTotal);

                        }
                        

                        //No Purchase - empty file
                        if (!reader.HasRows)
                        {
                            using (StreamWriter outputFile = new StreamWriter(myFullPath, false))
                            {
                            }
                        }
                    }

                    Console.WriteLine("Data displayed! Now press enter to move to the next section!");
                }
            }
            catch (Exception ex)
            {
                log.Error("Error Message: " + ex.Message.ToString(), ex);
            }
        }
    }
 
最佳 底部