Grafid Ответов: 2

Получить сумму каждого дня (C# и SQL server)


Пожалуйста, помогите !!
У меня есть приложение, которое я создал с помощью excel, но я хочу переместить его на c# и SQL server.
Приложение предназначено для ввода операции продажи (дата, номер заказа, имя клиента, сумма) liek this :
DAT        Num     NAME    AMOUNT
01/01/2018	1	JHON	$600.00
01/01/2018	2	JHON	$320.00
01/01/2018	3	FREDY	$20.00
02/01/2018	4	JHON	$32.00
02/01/2018	5	FREDY	$360.00
03/01/2018	6	MARK	$100.00
03/01/2018	7	MARK	$223.00


и мне нужно получить сумму операции за каждый такой день :
DAY	        AMOUNT	        NUMBER OF CUSTOMER
01/01/2018	$940.00         3
02/01/2018	$392.00         2
03/01/2018	$323.00         2


Я не знаю, как это сделать в c#, но надеюсь, что кто-то сможет мне в этом помочь.
Я уже сделал свой c# и связал его с SQL server, и все данные сохраняются в качестве теста. теперь мне просто нужно получить эти отфильтрованные данные за каждый день.
Спасибо

Что я уже пробовал:

Я попробовал кучу кода (LINQ), но у меня ничего не получилось. поскольку я c# noob, я не могу сказать, правильный ли код.
Обновление : я попробовал эту процедуру SQL Server
USE [SoutienEtudiant]
GO
/****** Object:  StoredProcedure [dbo].[getAllDaysBetweenTwoDate]    Script Date: 2/3/2018 1:29:03 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[getAllDaysBetweenTwoDate]
(
@FromDate DATETIME,    
@ToDate DATETIME
)
AS
BEGIN
    
    DECLARE @TOTALCount INT
    SET @FromDate = DATEADD(DAY,-1,@FromDate)
    Select  @TOTALCount= DATEDIFF(DD,@FromDate,@ToDate);

    WITH d AS 
            (
              SELECT top (@TOTALCount) AllDays = DATEADD(DAY, ROW_NUMBER() 
                OVER (ORDER BY object_id), REPLACE(@FromDate,'-',''))
              FROM sys.all_objects
            )
        SELECT AllDays From d
        
    RETURN 
END


а еще в приложении :
dataGridView1.DataSource = etu.getAllDaysBetweenTwoDate(dateTimePicker1.Value, dateTimePicker2.Value);


и он правильно заполняет datagridview1 отфильтрованными датами. Мне просто нужно теперь поставить рядом с каждой датой правильную сумму для операции и количество продаж.

2 Ответов

Рейтинг:
16

OriginalGriff

Попробуй:

SELECT Day, SUM(AMOUNT) AS Amount, COUNT(Amount) AS [Number of customer] 
FROM MyTable
GROUP BY Day
HAVING Day BETWEEN @FromDate AND @ToDate


Grafid

Спасибо, что сработало. Огромное спасибо!.
Меня просто беспокоит, почему этот код не включает в себя первый день диапазона дат.
У меня есть данные в : 31/01/2018 и 01/02/2018 и 02/02/2018, но он возвращает только данные с 01/02/2018 и 02/02/2018.
он действительно исключает 1-й день диапазона, который составляет 31/01/2018

Рейтинг:
1

Maciej Los

На случай если вы хотите узнать решение linq:

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("DAT", typeof(DateTime)));
dt.Columns.Add(new DataColumn("Num", typeof(int)));
dt.Columns.Add(new DataColumn("NAME", typeof(string)));
dt.Columns.Add(new DataColumn("AMOUNT", typeof(double)));

dt.Rows.Add(new object[]{new DateTime(2018,1,1), 1, "JHON", 600.00});
dt.Rows.Add(new object[]{new DateTime(2018,1,1), 2, "JHON", 320.00});
dt.Rows.Add(new object[]{new DateTime(2018,1,1), 3, "FREDY", 20.00});
dt.Rows.Add(new object[]{new DateTime(2018,1,2), 4, "JHON", 32.00});
dt.Rows.Add(new object[]{new DateTime(2018,1,2), 5, "FREDY", 360.00});
dt.Rows.Add(new object[]{new DateTime(2018,1,3), 6, "MARK", 100.00});
dt.Rows.Add(new object[]{new DateTime(2018,1,3), 7, "MARK", 223.00});


var result = dt.AsEnumerable()
	.GroupBy(x=>x.Field<DateTime>("DAT"))
	.Select(grp=>new
	{
		DAT = grp.Key.ToString("dd/MM/yyyy"),
		AMOUNT = grp.Sum(a=>a.Field<double>("AMOUNT")),
		NoOfCust = grp.Count()
	});


Один result переменные магазины:
DAT        AMOUNT NoOfCust
01/01/2018 940    3 
02/01/2018 392    2 
03/01/2018 323    2