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

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

我的存储过程

ALTER PROC 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
swf1014 回答:在 Sql 存储过程中按日期分组以计算收入

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

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 中使用结果。

本文链接:https://www.f2er.com/6201.html

大家都在问