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

QQ登录

只需一步,快速开始

maki

金牌服务用户

24

主题

99

帖子

375

积分

金牌服务用户

积分
375
maki
金牌服务用户   /  发表于:2025-1-21 10:36  /   查看:139  /  回复:22
1金币
求一个视图的写法。

想要达到这种效果。按照月份和订单汇总数据。订单在同一个月份就数量就统计在一起。如果跨月,就汇总到下一个月。交付人,备注,出货时间都是以拼接的方式
附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册

最佳答案

查看完整内容

大佬,这边有SQLServer测试了下: 如果您数据库版本较是2017及以上,那么就支持STRING_AGG函数: 可以试试下方这种方式: 如果是旧版2016及以下话,不知道此函数比较麻烦,可以试试下方这种方式: 效果如下:

22 个回复

倒序浏览
最佳答案
最佳答案
Levi.Zhang
超级版主   /  发表于:2025-1-21 10:36:47
来自 7#
大佬,这边有SQLServer测试了下:
如果您数据库版本较是2017及以上,那么就支持STRING_AGG函数:
可以试试下方这种方式:
  1. SELECT
  2.     YEAR([出货时间]) AS 交付年份,
  3.     MONTH([出货时间]) AS 交付月份,
  4.     订单号,
  5.     MIN([出货时间]) AS 出货时间,
  6.     SUM([出货数量]) AS 出货数量,
  7.     STRING_AGG([交付人员], ', ') AS 交付人员,
  8.     STRING_AGG([备注], ', ') AS 备注
  9. FROM [cs_1_21]
  10. GROUP BY
  11.     YEAR([出货时间]),
  12.     MONTH([出货时间]),
  13.     [订单号]
  14. ORDER BY
  15.     交付年份,
  16.     交付月份,
  17.     [订单号];
复制代码
如果是旧版2016及以下话,不知道此函数比较麻烦,可以试试下方这种方式:
  1. SELECT
  2.     -- 计算交付月份,使用 YEAR 和 MONTH 提取年月
  3.     YEAR(出货时间) AS 交付年份,
  4.     MONTH(出货时间) AS 交付月份,
  5.     订单号,
  6.     -- 获取最早的出货时间
  7.     MIN(出货时间) AS 出货时间,
  8.     -- 汇总出货数量
  9.     SUM(出货数量) AS 出货数量,
  10.     -- 拼接交付人员
  11.     STUFF((
  12.         SELECT ', ' + 交付人员
  13.         FROM cs_1_21 AS t2
  14.         WHERE t2.订单号 = t1.订单号 AND YEAR(t2.出货时间) = YEAR(t1.出货时间) AND MONTH(t2.出货时间) = MONTH(t1.出货时间)
  15.         FOR XML PATH('')
  16.     ), 1, 2, '') AS 交付人员,
  17.     -- 拼接备注
  18.     STUFF((
  19.         SELECT ', ' + 备注
  20.         FROM cs_1_21 AS t2
  21.         WHERE t2.订单号 = t1.订单号 AND YEAR(t2.出货时间) = YEAR(t1.出货时间) AND MONTH(t2.出货时间) = MONTH(t1.出货时间)
  22.         FOR XML PATH('')
  23.     ), 1, 2, '') AS 备注
  24. FROM cs_1_21 AS t1
  25. GROUP BY
  26.     YEAR(出货时间),
  27.     MONTH(出货时间),
  28.     订单号
  29. ORDER BY
  30.     交付年份,
  31.     交付月份,
  32.     订单号;
复制代码
效果如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Levi.Zhang
超级版主   /  发表于:2025-1-21 11:01:52
2#
大佬,这种需求感觉像是表格的自动合并:



这种效果可以满足大佬需求吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
maki
金牌服务用户   /  发表于:2025-1-21 11:07:29
4#
Levi.Zhang 发表于 2025-1-21 11:01
大佬,这种需求感觉像是表格的自动合并:

还需要数量上的合计呢?麻烦的是,要求订单号,一个月只能出现一次。
回复 使用道具 举报
Levi.Zhang
超级版主   /  发表于:2025-1-21 11:59:51
5#
本帖最后由 Levi.Zhang 于 2025-1-21 12:06 编辑

大佬,您试试这段视图代码:
这边再确认一下大佬用的是哪个数据库呢?
  1. SELECT
  2.     strftime('%Y-%m', [出货时间]) AS 交付月份,
  3.     订单号,
  4.     GROUP_CONCAT(DISTINCT strftime('%Y-%m-%d', [出货时间])) AS 出货时间,
  5.     SUM([出货数量]) AS 出货数量,
  6.     GROUP_CONCAT(DISTINCT [交付人员]) AS 交付人员,
  7.     GROUP_CONCAT(DISTINCT [备注]) AS 备注
  8. FROM
  9.     [数据表1]
  10. GROUP BY
  11.     strftime('%Y-%m', [出货时间]), [订单号]
复制代码
可以满足大佬的效果,但是有个小弊端,后面页面需要处理下此日期字段,因为内置库为SQLite,其中日期字段其实是OAdate;
在页面上可以把日期字段做下处理,以正常显示


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
maki
金牌服务用户   /  发表于:2025-1-21 13:17:13
6#
Levi.Zhang 发表于 2025-1-21 11:59
大佬,您试试这段视图代码:
这边再确认一下大佬用的是哪个数据库呢?
可以满足大佬的效果,但是有个小弊 ...

哦对,我用的sql server
回复 使用道具 举报
maki
金牌服务用户   /  发表于:2025-1-21 15:52:35
8#
Levi.Zhang 发表于 2025-1-21 14:35
大佬,这边有SQLServer测试了下:
如果您数据库版本较是2017及以上,那么就支持STRING_AGG函数:
可以试 ...

对了,就是这个效果。简直完美。正好我就是2016版本。我就是查了半天,用不来STUFF。谢谢!
回复 使用道具 举报
Levi.Zhang
超级版主   /  发表于:2025-1-21 16:05:06
9#
不客气哈~
回复 使用道具 举报
maki
金牌服务用户   /  发表于:2025-1-22 10:55:51
10#

再帮我改进一下。 如图,这是正式版数据库截图。这里有一个  最早出货时间, 最晚出货时间。
我想让  这两个时间能跨月显示。
回复 使用道具 举报
maki
金牌服务用户   /  发表于:2025-1-22 10:57:13
11#
想让相同订单号的数据,最早出货时间  跟  最晚出货时间 都是显示的一样的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部