diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index cef3bd61a5d1e..875707f55ccbe 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -450,10 +450,24 @@ def get_from_clause(self, template_processor=None, db_engine_spec=None): return TextAsFrom(sa.text(from_sql), []).alias('expr_qry') return self.get_sqla_table() - def adhoc_metric_to_sa(self, metric): + def adhoc_metric_to_sa(self, metric, cols): + """ + Turn an adhoc metric into a sqlalchemy column. + + :param dict metric: Adhoc metric definition + :param dict cols: Columns for the current table + :returns: The metric defined as a sqlalchemy column + :rtype: sqlalchemy.sql.column + """ expressionType = metric.get('expressionType') if expressionType == utils.ADHOC_METRIC_EXPRESSION_TYPES['SIMPLE']: - sa_column = column(metric.get('column').get('column_name')) + column_name = metric.get('column').get('column_name') + sa_column = column(column_name) + table_column = cols.get(column_name) + + if table_column: + sa_column = table_column.sqla_col + sa_metric = self.sqla_aggregations[metric.get('aggregate')](sa_column) sa_metric = sa_metric.label(metric.get('label')) return sa_metric @@ -518,7 +532,7 @@ def get_sqla_query( # sqla metrics_exprs = [] for m in metrics: if utils.is_adhoc_metric(m): - metrics_exprs.append(self.adhoc_metric_to_sa(m)) + metrics_exprs.append(self.adhoc_metric_to_sa(m, cols)) elif m in metrics_dict: metrics_exprs.append(metrics_dict.get(m).sqla_col) else: