package biz.report.agg;
|
|
import java.text.MessageFormat;
|
|
/**
|
* @author kimi
|
* @description
|
* @date 2024-09-19 13:53
|
*/
|
|
|
public enum AggPattern {
|
agg(1),//汇总
|
count(1),//计数
|
achieve(2),//达成
|
achieve_multipy(3),//达成
|
mom(3),//环比
|
yoy(3),//同比
|
contribution(3),//贡献
|
ranking(4),//排名
|
others(0),//其他补充信息
|
;
|
private int level;
|
|
AggPattern(int level) {
|
this.level = level;
|
}
|
|
public static AggPattern parse(String pattern) {
|
|
for (AggPattern value : values()) {
|
if (value.name().equalsIgnoreCase(pattern)) {
|
return value;
|
}
|
}
|
|
return others;
|
}
|
|
public int getLevel() {
|
return level;
|
}
|
|
public String getLevel1FieldSegment() {
|
for (AggPattern value : values()) {
|
|
if (value.equals(agg)) {
|
return "sum(ifnull({0},0)) as {1}";
|
}
|
if (value.equals(count)) {
|
return "count(ifnull({0},null)) as {1}";
|
}
|
if (value.equals(contribution)) {
|
return "sum(ifnull({0},0)) as {0}";
|
}
|
}
|
return null;
|
}
|
|
public String createSql(AggField field) {
|
String formula = "a.{0} = ifnull(a1.{0}, 0)";
|
String fieldName = field.getFieldName();
|
String measureField = field.getMeasureField();
|
String other = "";
|
switch (this) {
|
case agg:
|
formula = "a.{0} = ifnull(a.{0},0) + ifnull(a1.{0},0)";
|
break;
|
case count:
|
formula = "a.{0} = ifnull(a.{0},0) + ifnull(a1.{0},0)";
|
break;
|
case achieve:
|
int pos = measureField.indexOf("/");
|
other = measureField.substring(pos + 1);
|
formula = pos < 0 ? "a.{0} = {1}" : "a.{0} = if({2} = 0, 0, {1})";
|
break;
|
case mom:
|
formula = "a.{0} = if(ifnull(a1.{1},0) = 0, 1, -1 + a.{1}/a1.{1})";
|
break;
|
case yoy:
|
formula = "a.{0} = if(ifnull(a1.{1},0) = 0, 1, -1 + a.{1}/a1.{1})";
|
break;
|
case contribution:
|
formula = "a.{0} = if(ifnull(a1.{1},0) = 0, 0, a.{1}/a1.{1})";
|
break;
|
case ranking:
|
formula = "a.{0} = a1.rank_number";
|
break;
|
default:
|
formula = "a.{0} = ifnull(a1.{1}, ''--'')";
|
break;
|
}
|
|
return MessageFormat.format(formula, fieldName, measureField, other);
|
}
|
}
|