go多级下钻时候数据处理方案

多级下钻导出时候需要将下钻的字段全部导出,展开的字段在一个平面上


代码逻辑

先处理下钻的逻辑


groupList := strings.Split(o.Pms.GroupBy, ",")
var temp []string
for _, group := range groupList {    
    //需要兼容是否是导出 导出是多个    
    if !listtool.InArray(group, config.QueryGroup["asset_cost"]) {       
        return errors.New("请检查下钻维度,暂不支持")    
    }    
    switch group {    
    case "xxxxxx":       
        //这里需要注意  employee_name通过employee_abbr_name与各个表关联       
        temp = append(temp, "IFNULL(xxxx, '')")    
    default:       
        temp = append(temp, fmt.Sprintf("IFNULL(%s, '')", group))    
    }
}
groupSelectStr := fmt.Sprintf(" CONCAT_WS('&',%s) ", strings.Join(temp, ","))


处理sql

	sql := fmt.Sprintf(`
SELECT
	%s
	.... 
FROM
(
	SELECT
	   -- 多个字段通过 CONCAT_WS('分隔符',字段)来合并  需要主要 NULL的问题会导致数据异常 需要判断
		%s AS groupKey 
	FROM table1 
	WHERE 	1 = 1 
	GROUP BY 1 
) main
LEFT JOIN (
	SELECT
	   -- 多个字段通过 CONCAT_WS('分隔符',字段)来合并  需要主要 NULL的问题会导致数据异常 需要判断
		%s AS groupKey 
	FROM table2 
	WHERE 1 = 1 
	GROUP BY 1 
) table2 ON table1.groupKey = table2.groupKey`,groupSelectStr,groupSelectStr)


处理字段数据

//这里需要兼容导出查询,多级查询
var tempStr = ""
for index, column := range groupList {	
    switch column {	
        case "xxx":	    
         ....	
        default:		
         //需要注意  SUBSTRING_INDEX 1 和其他的不一致		
    
        if index == 0 {			
             tempStr += fmt.Sprintf(" SUBSTRING_INDEX(main.groupKey, '&', %d) AS %s,\n ", index+1, column)		
         } else {			
             tempStr += fmt.Sprintf(" SUBSTRING_INDEX(SUBSTRING_INDEX(main.groupKey, '&',  %d), '&', -1) AS %s,\n ", index+1, column)		
         }	
      }
}
//拼接查询字段
selectStr = fmt.Sprintf(" %s %s ", tempStr, selectStr)



版权声明:
作者:超级管理员
链接: https://blog.apecloud.ltd/article/detail.html?id=181
来源:猿码云个人技术站
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
/static/admin/img/weixin.jpg/static/admin/img/zfb.jpg
<<上一篇>
8个开源 uniapp 应用,太酷了吧(附源码)
下一篇>>