sql (para campos)

En esta página, se hace referencia al parámetro sql que forma parte de un campo.

sql también se puede usar como parte de una tabla derivada, como se describe en la página de documentación del parámetro sql (para tablas derivadas).

Uso

view: view_name {
  dimension: field_name {
    sql: ${revenue_in_dollars} - ${inventory_item.cost_in_dollars} ;;
  }
}
Jerarquía
sql
Tipos de campos posibles
Dimensión, grupo de dimensiones, filtro y medida

Acepta
Una expresión SQL

Reglas especiales
Es una expresión de SQL que varía según el type del campo (como se describe en detalle en esta página de documentación).

Definición

El parámetro sql admite varios tipos de expresiones de SQL que definirán una dimensión, una métrica o un filtro. La expresión que debes escribir varía según el tipo de campo que crees. Puedes encontrar más detalles sobre los tipos de dimensiones y filtros en la página de documentación Tipos de dimensiones, filtros y parámetros, mientras que puedes encontrar más detalles sobre los tipos de medidas en la página de documentación Tipos de medidas. Consulta también la página de documentación Incorporar objetos de SQL y hacer referencia a objetos de LookML.

sql para dimensiones

En general, el bloque sql para las dimensiones puede tomar cualquier SQL válido que se incluiría en una sola columna de una instrucción SELECT. En general, estas instrucciones se basan en el operador de sustitución de Looker, que tiene varias formas:

  • ${TABLE}.column_name hace referencia a una columna de la tabla que está conectada a la vista en la que trabajas.
  • ${dimension_name} hace referencia a una dimensión dentro de la vista en la que estás trabajando.
  • ${view_name.dimension_name} hace referencia a una dimensión de otra vista.
  • ${view_name.SQL_TABLE_NAME} hace referencia a otra vista o a una tabla derivada. (Ten en cuenta que SQL_TABLE_NAME en esta referencia es una cadena literal; no es necesario que la reemplaces por nada).

Si no se especifica sql, Looker supone que hay una columna en la tabla subyacente con el mismo nombre que el campo. Por ejemplo, seleccionar un campo llamado city sin un parámetro sql sería equivalente a especificar sql: ${TABLE}.city.

El parámetro sql de una dimensión no puede incluir ninguna agregación. Esto significa que no puede contener agregaciones de SQL ni referencias a medidas de LookML. Si deseas crear un campo con sql que incluya una agregación de SQL o que haga referencia a una medida de LookML, usa un parámetro sql en una medida, no en una dimensión.

Una dimensión muy simple que toma el valor directamente de una columna llamada revenue podría verse de la siguiente manera:

dimension: revenue_in_cents {
  sql: ${TABLE}.revenue ;;
  type: number
}

Una dimensión que depende de otra dimensión en la misma vista podría verse de la siguiente manera:

dimension: revenue_in_dollars {
  sql: ${revenue_in_cents} / 100 ;;
  type: number
}

Una dimensión que depende de otra dimensión en una vista diferente podría verse de la siguiente manera:

dimension: profit_in_dollars {
  sql: ${revenue_in_dollars} - ${inventory_item.cost_in_dollars} ;;
  type: number
}

Una dimensión que depende de otra dimensión en una tabla derivada podría verse de la siguiente manera:

dimension: average_margin {
  sql: (SELECT avg(${gross_margin} FROM ${order_facts.SQL_TABLE_NAME})) ;;
  type: number
}

Los usuarios de SQL más avanzados pueden realizar cálculos relativamente avanzados, incluidas las subconsultas correlacionadas (nota: no todos los dialectos de bases de datos admiten subconsultas correlacionadas):

dimension: user_order_sequence_number {
  type: number
  sql:
    (
      SELECT COUNT(*)
      FROM orders AS o
      WHERE o.id <= ${TABLE}.id
        AND o.user_id = ${TABLE}.user_id
    ) ;;
}

Para obtener más detalles, consulta la documentación de un tipo de dimensión específico.

sql para grupos de dimensiones

El parámetro sql para un dimension_group toma cualquier expresión SQL válida que contenga datos en formato de marca de tiempo, fecha y hora, fecha, época o aaaammdd.

sql para medidas

El bloque sql para las medidas suele adoptar una de las siguientes dos formas:

  • Es el SQL sobre el que se realizará una función de agregación (como COUNT, SUM, AVG), nuevamente con el operador de sustitución de Looker, como se describe en la sección SQL para dimensiones.
  • Un valor basado en varias otras medidas

Por ejemplo, para calcular los ingresos totales en dólares, podríamos usar la siguiente fórmula:

measure: total_revenue_in_dollars {
  sql: ${revenue_in_dollars} ;;
  type: sum
}

Para calcular nuestras ganancias totales, podríamos usar la siguiente fórmula:

measure: total_revenue_in_dollars {
  sql: ${total_revenue_in_dollars} - ${inventory_item.total_cost_in_dollars} ;;
  type: number
}

Para obtener más detalles, consulta la documentación de un tipo de métrica específico.

Para un tipo de medida count, puedes omitir el parámetro sql.

Para otros tipos de medidas, si no se especifica sql, Looker supone que hay una columna en la tabla subyacente con el mismo nombre que el campo. Dado que una medida debe tener un nombre que indique que es un agregado de un conjunto subyacente de valores, en la práctica, siempre debes incluir un parámetro sql.

Desafíos matemáticos de SQL

Hay dos desafíos frecuentes que surgen con la división en el parámetro sql.

Primero, si usas la división en tu cálculo, debes protegerte contra la posibilidad de dividir por cero, lo que provocará un error de SQL. Para ello, usa la función de SQL NULLIF. Por ejemplo, este ejemplo significa "si el denominador es cero, trátalo como NULL":

measure: active_users_percent {
  sql: ${active_users} / NULLIF(${users}, 0) ;;
  type: number
}

Otro problema es la forma en que SQL controla las operaciones matemáticas con números enteros. Si divides 5 entre 2, la mayoría de las personas espera que el resultado sea 2.5. Sin embargo, muchos dialectos de SQL devolverán el resultado como 2, ya que, cuando se dividen dos números enteros, el resultado también es un número entero. Para solucionar este problema, puedes multiplicar el numerador por un número decimal para forzar a SQL a devolver un resultado decimal. Por ejemplo:

measure: active_users_percent {
  sql: 100.00 * ${active_users} / NULLIF(${users}, 0) ;;
  type: number
}

Variables de Liquid con sql

También puedes usar variables de Liquid con el parámetro sql. Las variables de Liquid te permiten acceder a datos como los valores de un campo, datos sobre el campo y los filtros aplicados al campo.

Por ejemplo, esta dimensión enmascara la contraseña de un cliente según un atributo del usuario de Looker:

dimension: customer_password {
  sql:
    {% if _user_attributes['pw_access'] == 'yes' %}
      ${password}
    {% else %}
      "Password Hidden"
    {% endif %} ;;
}