我们经常需要在查询列表中用到“组合计算列”,通过“组合计算列”我们可以进行一些特殊的计算:
1、比如把多列的值做加减乘除运算并通过“组合计算列”输出;
2、拼接多列的值,比如某个客户有“中文名”和“英文名”,需要合并成一列“张三 Tony Zhang”这样的(如果是同一个表单字段,建议用“《虚拟字段》”功能);
3、汇总输出子表中的某一列的值,比如需要在项目列表中,把项目成员姓名拼接成一列进行输出;
4、比如想在查询列表中显示表单中图片列表是否有图片,便于快速判断需要上传图片的记录;
组合计算列怎么用呢?进入要单据查询列表后,点击列表,进入列设置:
在“设置列表字段”窗口中,选择自定义列类型“组合计算列”并“添加”后,选中刚添加的列,设置“列表头”属性(下入设置为了“部门员工”),以及设置“数据库字段”和“字段计算语句”属性。其中字段计算语句属性就是下面要讲到的SQL语句:
第1,2种情况比较简单:
比如要把“中文名”和“英文名”合并成一列,则可以用这样的SQL(加减乘除的情况类似)
-- 注意,如果是当前表单上的字段一定要加__maintable__ -- 否则如果不加的话,假设客户列表有__Name__字段,客户所属业务员(员工表单Employee)也有__Name__字段 -- 如果不加__maintable__则SQLServer中会报“列名 '__Name__' 不明确。”这样的错误,MySQL也会报错。 __maintable__.__Name__ + " " + __maintable__.__NameEN__
3、汇总输出子表某一列的值:
-- SQLServer -- 我们可以直接在SQLServer的E6数据库中执行这个语句,可以看到输出2列,第一列为部门名称,第二列为部门下面的员工姓名列表 SELECT __maintable__.__Name__, STUFF((SELECT ','+ltrim(emp.__Name__) FROM __Employee__ emp LEFT JOIN __Department__ dept ON emp.__FK_Department_=dept.__ID__ WHERE emp.__FK_Department_ = __maintable__.__ID__ FOR XML PATH('')),1,1,'') AS __EmpNames__ FROM __Department__ AS __maintable__; -- MySQL -- 我们可以直接在MySQL的E6数据库中执行这个语句,可以看到输出2列,第一列为部门名称,第二列为部门下面的员工姓名列表 SELECT __maintable__.__Name__, (SELECT GROUP_CONCAT(__Name__ SEPARATOR ', ') AS __EmployeeName__ FROM __Employee__ WHERE __FK_Department_=__maintable__.__ID__) AS __EmpNames__ FROM __Department__ AS __maintable__
从上面的两端SQL中可以看到SQLServer用到了FOR XML PATH语法,而MySQL用到了GROUP_CONCAT函数来实现汇总子表中的某一列的值
那么我们在“组合计算列”的“字段计算语句”中应该填哪一段SQL呢?
-- 注意,里面的表名记得根据您实际的主表子表表名进行修改,字段名也要改(__maintable__.__ID__不要随意变,表示的是主表ID字段) -- 注意:不能包含“ AS __EmpNames__”,因为__EmpNames__在“组合计算列”的“数据库字段”属性中设置 -- SQLServer STUFF((SELECT ','+ltrim(emp.__Name__) FROM __Employee__ emp LEFT JOIN __Department__ dept ON emp.__FK_Department_=dept.__ID__ WHERE emp.__FK_Department_ = __maintable__.__ID__ FOR XML PATH('')),1,1,'') -- 注意,不能包含“ AS __EmpNames__” -- MySQL (SELECT GROUP_CONCAT(__Name__ SEPARATOR ', ') AS __EmployeeName__ FROM __Employee__ WHERE __FK_Department_=__maintable__.__ID__) -- 注意,不能包含“ AS __EmpNames__”
4、判断表单的图片列表是否有图片
-- 下面SQL中tb_Customer表示某个表单的数据库表名(这里是客户表单,编号为Customer) -- 而tb_CustomerPictureBoxList表示的是客户表单中的图片列表对于的数据库表名 SELECT __maintable__.__Name__ , ISNULL((SELECT TOP 1 '有图片'FROM tb_CustomerPictureBoxList WHERE __FK_Customer_ = __maintable__.__ID__),'') AS __HasImages__ FROM tb_Customer __maintable__ -- MySQL SELECT __maintable__.__Name__ , IFNULL((SELECT '有图片'FROM tb_CustomerPictureBoxList WHERE __FK_Customer_ = __maintable__.__ID__ LIMIT 0, 1),'') AS __HasImages__ FROM tb_Customer __maintable__
那么我们在“组合计算列”的“字段计算语句”中应该填哪一段SQL呢?
-- SQLServer -- 注意:不能包含“ AS __HasImages__”,因为__HasImages__在“组合计算列”的“数据库字段”属性中设置 ISNULL((SELECT TOP 1 '有图片'FROM tb_CustomerPictureBoxList WHERE __FK_Customer_ = __maintable__.__ID__),'') -- 注意,不能包含“ AS __HasImages__” -- MySQL IFNULL((SELECT '有图片'FROM tb_CustomerPictureBoxList WHERE __FK_Customer_ = __maintable__.__ID__ LIMIT 0, 1),'') -- 注意,不能包含“AS __HasImages__”
效果:
拼接中文名和英文名:
拼接子表字段名: