联系
我们

工作日 9:00-18:00

13632615190

“组合计算列”常用SQL

我们经常需要在查询列表中用到“组合计算列”,通过“组合计算列”我们可以进行一些特殊的计算:

1、比如把多列的值做加减乘除运算并通过“组合计算列”输出;

2、拼接多列的值,比如某个客户有“中文名”和“英文名”,需要合并成一列“张三 Tony Zhang”这样的(如果是同一个表单字段,建议用“虚拟字段”功能);

3、汇总输出子表中的某一列的值,比如需要在项目列表中,把项目成员姓名拼接成一列进行输出;

4、比如想在查询列表中显示表单中图片列表是否有图片,便于快速判断需要上传图片的记录;


组合计算列怎么用呢?进入要单据查询列表后,点击列表,进入列设置:

image.png

在“设置列表字段”窗口中,选择自定义列类型“组合计算列”并“添加”后,选中刚添加的列,设置“列表头”属性(下入设置为了“部门员工”),以及设置“数据库字段”和“字段计算语句”属性。其中字段计算语句属性就是下面要讲到的SQL语句:

image.png


第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__”

效果:

拼接中文名和英文名:

image.png

拼接子表字段名:

image.png