一、计算每个客户在订购时间过去的不同时间范围内的货品价值和总运货费
在帆软报表(FineReport)中,你可以使用时间参数来参与表格计算。时间参数可以用于过滤数据、计算日期差、分组汇总等。以下是如何在帆软报表中设置和使用时间参数的步骤,并将其应用于表格计算。
步骤 1:创建时间参数
- 1、打开报表设计器:
- 打开你的 .cpt 报表文件。
- 2、添加时间参数:
- 在报表设计器左侧的“参数”面板中,点击“新建参数”按钮。
- 创建一个参数 截止日期,类型为日期。
- 可以设置默认值为当前日期,例如 =date() 或者允许用户输入。
步骤 2:编写 SQL 查询 如下操作
1.1、数据库查询
-- 计算每个客户在订购时间过去的不同时间范围内的货品价值和总运货费
SELECT
公司名称,
SUM ( CASE WHEN 天数差 BETWEEN 0 AND 90 THEN 货品价值 ELSE 0 END ) AS '0-90天货品价值',
SUM ( CASE WHEN 天数差 BETWEEN 0 AND 90 THEN 运货费 ELSE 0 END ) AS '0-90天运货费',
SUM ( CASE WHEN 天数差 BETWEEN 91 AND 180 THEN 货品价值 ELSE 0 END ) AS '91-180天货品价值',
SUM ( CASE WHEN 天数差 BETWEEN 91 AND 180 THEN 运货费 ELSE 0 END ) AS '91-180天运货费',
SUM ( CASE WHEN 天数差 BETWEEN 181 AND 360 THEN 货品价值 ELSE 0 END ) AS '181-360天货品价值',
SUM ( CASE WHEN 天数差 BETWEEN 181 AND 360 THEN 运货费 ELSE 0 END ) AS '181-360天运货费',
SUM ( CASE WHEN 天数差 > 360 THEN 货品价值 ELSE 0 END ) AS '360天以上货品价值',
SUM ( CASE WHEN 天数差 > 360 THEN 运货费 ELSE 0 END ) AS '360天以上运货费'
FROM
(
-- 子查询获取每个公司的订单记录,并计算与截止日期的天数差
SELECT
s3.公司名称,
julianday ( '${截止日期}' ) - julianday ( s1.订购日期 ) AS 天数差, -- SQLite 数据库
-- MySQL数据库 DATEDIFF( STR_TO_DATE('${截止日期}', '%Y-%m-%d'), STR_TO_DATE(s1.订购日期, '%Y-%m-%d')) AS 天数差,
-- SQLserver 数据库 DATEDIFF( DAY, CAST ( substr(s1.订购日期,10) AS DATE ), CAST ( '${截止日期}' AS DATE ) ) AS 天数差,
( s2.单价 * s2.数量 ) AS 货品价值,
s1.运货费
FROM
S订单 s1
LEFT JOIN S订单明细 s2 ON s1.订单ID = s2.订单ID
LEFT JOIN S客户 s3 ON s1.客户ID = s3.客户ID
WHERE
'${截止日期}' >= s1.订购日期
) AS sub
GROUP BY
公司名称;
1.2、内容设计
1.3、最终效果
二、输入呆滞时间,获取范围内明细
2.1、数据库查询
-- 计算每个记录的天数差,并过滤符合条件的记录
SELECT
s3.公司名称,
julianday ( '${截止日期}' ) - julianday ( s1.订购日期 ) AS 天数差,
s1.订购日期 ,
-- MySQL数据库 DATEDIFF( STR_TO_DATE('${截止日期}', '%Y-%m-%d'), STR_TO_DATE(s1.订购日期, '%Y-%m-%d')) AS 天数差,
-- SQLserver 数据库 DATEDIFF( DAY, CAST ( substr(s1.订购日期,10) AS DATE ), CAST ( '${截止日期}' AS DATE ) ) AS 天数差,
( s2.单价 * s2.数量 ) AS 货品价值,
s1.运货费
FROM
S订单 s1
LEFT JOIN S订单明细 s2 ON s1.订单ID = s2.订单ID
LEFT JOIN S客户 s3 ON s1.客户ID = s3.客户ID
WHERE
'${截止日期}' >= s1.订购日期
AND julianday('${截止日期}') - julianday(s1.订购日期) <= ${天数差}
;