在 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
.
中使用结果
我正在尝试按发票日期对收入进行分组,但它似乎不起作用。请指导我在这里缺少什么
我的存储过程:
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
.