在 SQL 存储过程中按日期分组以计算收入

Group by date in SQL stored procedure to calulate revenue

我正在尝试按发票日期对收入进行分组,但它似乎不起作用。请指导我在这里缺少什么

我的存储过程:

ALTER PROCEDURE GetRevenueDaily 
    @fromDate VARCHAR(10),
    @toDate VARCHAR(10)
AS
BEGIN
    SELECT 
        CAST(b.create_at AS DATE) AS Date,
        SUM(b.total + b.transport_fee - b.discount) AS Revenue
    FROM 
        Bill b
    WHERE 
        b.create_at <= CAST(@toDate AS Date)
        AND b.create_at >= CAST(@fromDate AS Date)
        AND b.status = 1
        AND b.isPay = 1
    GROUP BY 
        b.create_at
END

EXEC dbo.GetRevenueDaily @fromDate = '07/02/2021',
                         @toDate = '07/30/2021'

我正在尝试使用 group by b.create_at 但它不起作用 :(

结果:

2021-07-04  1499000.00
2021-07-04  21699000.00
2021-07-04  3199000.00
2021-07-04  32180000.00
2021-07-05  40888000.00
2021-07-05  23394000.00
2021-07-05  4299000.00
2021-07-05  7299000.00
2021-07-05  5299000.00
2021-07-15  4399000.00
2021-07-15  22899000.00
2021-07-15  47957000.00
2021-07-16  4299000.00
2021-07-17  5086400.00
2021-07-18  4399000.00
2021-07-24  114995000.00
2021-07-25  1619000.00

使用正确的数据类型!如果存储过程需要日期,则将它们作为日期传递:

ALTER PROC GetRevenueDaily (
    @fromDate DATE,
    @toDate DATE
) AS
BEGIN
    SELECT CAST(b.create_at as DATE) as Date,
           SUM(b.total + b.transport_fee - b.discount) as Revenue
   FROM Bill b
   WHERE b.create_at <= @toDate AND
         b.create_at >= @fromDate AND
         b.status = 1 AND
         b.isPay = 1
   GROUP BY CAST(b.create_at as DATE);
------------^ Note that this is also fixed to match the `SELECT`
END;

我不知道数据是如何存储的,但是如果有 NULL 个值,这一行可能会很麻烦:

SUM(b.total + b.transport_fee - b.discount) 

您可能需要:

SUM(COALESCE(b.total, 0) + COALESCE(b.transport_fee, 0) - COALESCE(b.discount, 0)) 

调用存储过程时,使用规范的日期格式

EXEC dbo.GetRevenueDaily @fromDate = '2021-07-02',
                         @toDate = '2021-07-30';

注意:您还可以考虑将此存储过程编写为存储函数,以便可以在 SELECT.

中使用结果