分组合并字符串
1. 问题描述编辑
在针对数字类型的数据时,我们有分组求和,求最大最小值等操作。
而在处理字符串类型的数据时,有时我们也需要将同分组的数据合并拼接到一起,实现效果如下图:
2. 解决方案编辑
利用报表设计器的功能实现或是利用相关数据库的函数来实现。
3. 示例
3.1 通过设计器实现
1)数据集
添加数据集ds1,sql语句为:SELECT * FROM 部门
2)模板设置
将字段拖进相应的单元格中,模板设置如下:
3)单元格属性
选择B1单元格,右击选择“扩展”,将B1单元格扩展方向设置为“不扩展”,如下图所示:
4)保存预览
保存预览,即可上图所示效果。
SQL方法
SELECT dudao,STUFF(( select','+ khmc from kehu a where a.dudao=b.dudao for xml path('')), 1, 1,'') as mc
from kehu b
group by dudao
-----------------------------
SELECT STUFF(( select','+ khmc from kehu a for xml path('')), 1, 1,'')
其他数据库方法
1)Oracle数据库
- select
- 总部门,
- wmsys.wm_concat(部门名称) as 部门名称
- from 部门
- group by 总部门
3)mysql数据库
- select
- 总部门,
- group_concat(部门名称)
- from 部门
- group by 总部门
有时候我们希望从目标字符串中提取出所有的数字,重新组合成一个字符串,如下图所示:
-----------------------------------------
先将字符串分割成数组,再对数组每一项进行筛选,保留下数字,最后以字符串输出。
3.解决步骤编辑
1)先利用split( )函数进行分割,这里要分割每一项,所以分割符为空:split(目标字符串,"")
2)利用GREPARRAY( )函数对上一步结果进行筛选,这里使用了regexp( )函数来判断是否是数字:GREPARRAY(上一步结果, regexp(item, "[0-9]"))
3)使用JOINARRAY( )函数将数组以字符串方式输出,拼接符为空:JOINARRAY(上一步结果, "")
4)综合起来,公式就是JOINARRAY(GREPARRAY(split(目标字符串, ""), regexp(item, "[0-9]")), "")
------------------------------------
判断多项字符串至少一项被包含
1.问题描述
有时候我们要判断一个多项字符串是否至少有一项被另外个字符串包含。
如:有一批货原本是属于"A供货商,B供货商"的,结果却被"B供货商,C供货商"拼车拉走了。
这批货有没有出问题呢,只要判断"A供货商,B供货商"中是否至少有一项在"B供货商,C供货商"中,如果有就没问题。
2.解决思路
将两个字符串都转化为数组,判断一个数组的每一项是否存在其中一项在另外个数组中,如果有,则包含,否则不包含。
3.解决步骤
1)将字符串1分割成数组:SPLIT(字符串1,",")
2)确保第二个字符串转化为数组:IF(FIND(",", 字符串2) > 0,SPLIT(字符串2,","), ARRAY(字符串2))
这是因为字符串2中如果没有分隔符,则SPLIT(字符串2,",")的结果还是一个字符串。
字符串1就算没转化成功也能参与后面的运算,就不强制。
3)判断字符串1转化的数组的每一项是否存在字符串2数组中:GREPARRAY(字符串1数组, INARRAY(item, 字符串2数组) > 0)
这里使用了 INARRAY( )函数来判断是否存在, INARRAY( )的第二个参数一定要是数组,这就是第二步需要强制转化的原因。
4)判断上一步结果的项数,项数大于0则包含,否则不包含:IF(LEN(上一步结果)>0,"包含","不包含")
5)综合判断公式为:IF(LEN(GREPARRAY(SPLIT(字符串1,","), INARRAY(item, IF(FIND(",", 字符串2) > 0, SPLIT(字符串2,","), ARRAY(字符串2))) > 0)) > 0, "包含", "不包含")