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
二维码
打赏
共有0条评论