请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

chenfsl

注册会员

4

主题

12

帖子

48

积分

注册会员

积分
48
chenfsl
注册会员   /  发表于:2025-5-8 14:50  /   查看:94  /  回复:8
1金币
微信图片_20250508142129.png 微信图片_20250508142134.png


如图 我想做一个能够统计数量和价税合计的前后三年的数据对比
通过我选择的时间(默认本月1号至今日),客户(默认全选),产品(默认全选)
表1中出现所选时间的前后三年的所有数据(如选择了2024-1-1 至 2024-3-31,则出现''2021-1-1至2021-3-31''及''2022-1-1至2022-3-31''及''2023-1-1至2023-3-31''及''2024-1-1及2024-3-31''及''2025-1-1至2025-3-31''及''2026-1-1至2026-3-31''及''2027-1-1至2027-3-31'', 共7年数据)出现所有客户及产品的排列组合
表2中只出现选择条件下的7年的合计数据(即每年的1月到3月的,共7行)
另外,假如我再选择客户或者产品,这个时候表1和表2也会相应的根据我选择的客户或产品进行重新统计
烦请帮忙看下能否实现这样的功能

8 个回复

倒序浏览
lucas.Yan
超级版主   /  发表于:2025-5-8 16:49:05
沙发
针对这种较复杂的自定义查询条件,我建议您通过报表参数和自定义SQL配合进行查询。
首先创建两个报表参数,开始时间、结束时间,然后通过{DateAdd()}函数对传入的年份进行偏移,例如
where DateAdd("y",-1,@开始时间) <  数据库时间字段 and 数据库时间字段 < DateAdd("y",-1,@结束时间)
以此类推来拼接处7年的范围

参考文档:

【报表-参数过滤】同一报表,根据不同条件,执行不同Sql - Wyn 商业智能专区 - 产品教程 - 葡萄城开发者社区
【报表-参数过滤】一分钟搞定多条件组合查询 - Wyn 商业智能专区 - 产品教程 - 葡萄城开发者社区




回复 使用道具 举报
chenfsl
注册会员   /  发表于:2025-5-9 09:20:01
板凳
lucas.Yan 发表于 2025-5-8 16:49
针对这种较复杂的自定义查询条件,我建议您通过报表参数和自定义SQL配合进行查询。
首先创建两个报表参数 ...



我尝试这样写了SQL 但是出来的数据依旧是今年的
微信图片_20250509091941.png
微信图片_20250509091721.png
微信图片_20250509091811.png
回复 使用道具 举报
chenfsl
注册会员   /  发表于:2025-5-9 10:35:08
地板
lucas.Yan 发表于 2025-5-8 16:49
针对这种较复杂的自定义查询条件,我建议您通过报表参数和自定义SQL配合进行查询。
首先创建两个报表参数 ...



去年的合计现在能出来了  是SQL的问题  但是现在遇到一个新的问题 我想做个穿透 传参数的时候用的这个dataadd 穿进去后默认是不是年度减一 变成了日期减一
麻烦老师帮忙看下哪里有问题
微信图片_20250509103313.png
微信图片_20250509103310.png
回复 使用道具 举报
lucas.Yan
超级版主   /  发表于:2025-5-9 11:24:37
5#
本帖最后由 lucas.Yan 于 2025-5-9 11:45 编辑
chenfsl 发表于 2025-5-9 10:35
去年的合计现在能出来了  是SQL的问题  但是现在遇到一个新的问题 我想做个穿透 传参数的时候用的这 ...


不好意思前面示例写的有些问题,你尝试用yyyy来偏移。
其他的报表函数,如果您不清楚对应用法,可以点击https://msdn.microsoft.com/zh-CN/library/32s6akha.aspx。链接来查看函数用法。

image.png663917235.png

回复 使用道具 举报
chenfsl
注册会员   /  发表于:2025-5-9 12:10:38
6#
lucas.Yan 发表于 2025-5-9 11:24
不好意思前面示例写的有些问题,你尝试用yyyy来偏移。
其他的报表函数,如果您不清楚对应用法,可以点 ...

感谢老师  年度数据已经能在三张表单内展示了  
我想问一下有办法把三张表单合并展示在一个柱状图上吗 横坐标是选择的时间和对比的时间(前一年月+当前选择年月+后一年月)纵坐标是数量合计   
比如选择了今年1月到5月 横坐标上 一个柱状展示今年1-5月的数量合计 另一个展示去年1-5月的合计数量 再有一条展示下年的1-5月的合计数量



微信图片_20250509120922.png
回复 使用道具 举报
lucas.Yan
超级版主   /  发表于:2025-5-9 14:48:48
7#
chenfsl 发表于 2025-5-9 12:10
感谢老师  年度数据已经能在三张表单内展示了  
我想问一下有办法把三张表单合并展示在一个柱状图上吗  ...

我猜测您现在是写了三段偏移的sql,但是如果您需要绑定在同一个图表上进行展示。数据肯定要先合并在一起。您可以通过unionAll把这几段sql进行拼接,并以另一个字段进行区分。
后续以这个字段作为分类,数值就会自动聚合。
回复 使用道具 举报
chenfsl
注册会员   /  发表于:2025-5-9 15:52:04
8#
lucas.Yan 发表于 2025-5-9 14:48
我猜测您现在是写了三段偏移的sql,但是如果您需要绑定在同一个图表上进行展示。数据肯定要先合并在一起 ...

老师您好   不是很明白

我现在用left join组合的
SQL如下:


SELECT
    当前.年月 AS 当前年月,
    当前.数量合计 AS 当前数量合计,
    当前.价税合计 AS 当前价税合计,
    上一年.年月 AS 上一年年月,
    上一年.数量合计 AS 上一年数量合计,
    上一年.价税合计 AS 上一年价税合计,
    下一年.年月 AS 下一年年月,
    下一年.数量合计 AS 下一年数量合计,
    下一年.价税合计 AS 下一年价税合计
FROM
    (
        SELECT 年月, SUM(数量) AS 数量合计, SUM(本币价税合计) AS 价税合计
        FROM OA_ShiplistTrlAll
        WHERE 单据日期 >= @p开始日期 AND 单据日期 <=@p结束日期
and  ('全选' in (@p存货名称) or 存货名称 in (@p存货名称)) and ('全选' in (@p客户名称) or 客户名称 in (@p客户名称))
        GROUP BY 年月
    ) AS 当前
LEFT JOIN
    (
        SELECT
            年月,
            SUM(数量) AS 数量合计,
            SUM(本币价税合计) AS 价税合计,
            CAST(SUBSTRING(年月, 1, 4) AS INT) + 1 AS 加一年后的年份,
            SUBSTRING(年月, 6, 2) AS 月份
        FROM OA_ShiplistTrlAll
        WHERE 单据日期 >= DateAdd(year,-1,@p开始日期) AND 单据日期 <=DateAdd(year,-1,@p结束日期)  
and  ('全选' in (@p存货名称) or 存货名称 in (@p存货名称)) and ('全选' in (@p客户名称) or 客户名称 in (@p客户名称))
        GROUP BY 年月
    ) AS 上一年
    ON 当前.年月 = CAST(上一年.加一年后的年份 AS VARCHAR(4)) + '-' + 上一年.月份
LEFT JOIN
    (
        SELECT
            年月,
            SUM(数量) AS 数量合计,
            SUM(本币价税合计) AS 价税合计,
            CAST(SUBSTRING(年月, 1, 4) AS INT) - 1 AS 减一年后的年份,
            SUBSTRING(年月, 6, 2) AS 月份
        FROM OA_ShiplistTrlAll
        WHERE 单据日期 >= DateAdd(year,1,@p开始日期)  AND 单据日期 <= DateAdd(year,1,@p结束日期)  
        GROUP BY 年月
    ) AS 下一年
    ON 当前.年月 = CAST(下一年.减一年后的年份 AS VARCHAR(4)) + '-' + 下一年.月份;


微信图片_20250509154801.png

用这种形式出来的数据  能够让图标柱状图下方显示对应的各个年月,然后上方显示数量合计的文本吗
回复 使用道具 举报
lucas.Yan
超级版主   /  发表于:2025-5-9 16:36:29
9#
chenfsl 发表于 2025-5-9 15:52
老师您好   不是很明白

我现在用left join组合的

如果您现在的sql
  1. SELECT
  2.             年月,
  3.             SUM(数量) AS 数量合计,
  4.             SUM(本币价税合计) AS 价税合计,
  5.             CAST(SUBSTRING(年月, 1, 4) AS INT) + 1 AS 加一年后的年份,
  6.             SUBSTRING(年月, 6, 2) AS 月份
  7.         FROM OA_ShiplistTrlAll
  8.         WHERE 单据日期 >= DateAdd(year,-1,@p开始日期) AND 单据日期 <=DateAdd(year,-1,@p结束日期)  
  9. and  ('全选' in (@p存货名称) or 存货名称 in (@p存货名称)) and ('全选' in (@p客户名称) or 客户名称 in (@p客户名称))
  10.         GROUP BY 年月
复制代码
查询出来的数据是下面的格式
年月 数量 价格(去年)

那么针对您的需求将会有多个类似的sql被编写出来

此时我们需要将这些数据进行整合成一个数据集,可以使用下面的
select *,“本年” as 时间段 from ...
union ALL
select *,“去年” as 时间段 from ...
union ALL
select *,“下年” as 时间段 from ....

这样拼接出来的就是
年月 数量 价格 去年
年月 数量 价格 本年
年月 数量 价格 下年
此时你绑定时间段这个字段就能区分各个时间段并聚合计算它们数值了

文档:
SQL UNION ALL
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部