SQL (für Felder)

Diese Seite bezieht sich auf den Parameter sql, der Teil eines Felds ist.

sql kann auch als Teil einer abgeleiteten Tabelle verwendet werden, wie auf der Dokumentationsseite zum Parameter sql (für abgeleitete Tabellen) beschrieben.

Nutzung

view: view_name {
Dimension: Feldname {
sql: ${revenue_in_dollars} - ${inventory_item.cost_in_dollars} ;
}
}
Hierarchie
sql
Mögliche Feldtypen
Dimension, Dimensionsgruppe, Filter, Messen

Akzeptiert
Ein SQL-Ausdruck

Sonderregeln
Ein SQL-Ausdruck, der je nach type des Felds variiert (weitere Informationen siehe unten)

Definition

Für den Parameter sql können verschiedene Arten von SQL-Ausdrücken verwendet werden, um eine Dimension, einen Messwert oder einen Filter zu definieren. Der Ausdruck, den Sie schreiben müssen, variiert je nach Art des Felds, das Sie erstellen. Weitere Informationen zu Dimensions- und Filtertypen finden Sie auf der Dokumentationsseite zu Dimensionen, Filtern und Parametertypen. Informationen zu Messtypen finden Sie auf der Dokumentationsseite zu Messtypen. Weitere Informationen finden Sie auch auf der Dokumentationsseite SQL einbinden und auf LookML-Objekte verweisen.

sql für Dimensionen

Der sql-Block für Dimensionen kann in der Regel jede gültige SQL-Abfrage annehmen, die in eine einzelne Spalte einer SELECT-Anweisung geschrieben wird. Diese Anweisungen basieren im Allgemeinen auf dem Substitutionsoperator von Looker, der mehrere Formen hat:

  • ${TABLE}.column_name verweist auf eine Spalte in der Tabelle, die mit der Ansicht verknüpft ist, an der Sie gerade arbeiten.
  • ${dimension_name} verweist auf eine Dimension in der Ansicht, an der Sie arbeiten.
  • ${view_name.dimension_name} verweist auf eine Dimension aus einer anderen Ansicht.
  • ${view_name.SQL_TABLE_NAME} verweist auf eine andere Ansicht oder eine abgeleitete Tabelle. Beachten Sie, dass SQL_TABLE_NAME in dieser Referenz ein literaler String ist. Sie müssen nicht durch etwas ersetzt werden.

Wenn sql nicht angegeben ist, geht Looker davon aus, dass in der zugrunde liegenden Tabelle eine Spalte mit demselben Namen wie das Feld vorhanden ist. Wenn Sie beispielsweise das Feld city ohne den Parameter sql auswählen, entspricht dies der Angabe von sql: ${TABLE}.city.

Der Parameter sql einer Dimension kann keine Aggregationen enthalten. Das bedeutet, dass sie keine SQL-Aggregationen oder Verweise auf LookML-Messwerte enthalten darf. Wenn Sie ein Feld mit sql erstellen möchten, das eine SQL-Aggregation enthält oder auf einen LookML-Messwert verweist, verwenden Sie einen sql-Parameter in einem Messwert, nicht in einer Dimension.

Eine sehr einfache Dimension, die den Wert direkt aus einer Spalte mit dem Namen revenue übernimmt, könnte so aussehen:

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

Eine Dimension, die auf einer anderen Dimension in derselben Ansicht basiert, könnte wie folgt aussehen:

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

Eine Dimension, die auf einer anderen Dimension in einer anderen Datenansicht basiert, könnte wie folgt aussehen:

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

Eine Dimension, die auf einer anderen Dimension in einer abgeleiteten Tabelle basiert, könnte so aussehen:

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

Fortgeschrittene SQL-Nutzer können relativ erweiterte Berechnungen durchführen, einschließlich korrelierter Unterabfragen (Hinweis: Nicht alle Datenbankdialekte unterstützen korrelierte Unterabfragen):

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
    ) ;;
}

Weitere Informationen finden Sie in der Dokumentation für einen bestimmten Dimensionstyp.

sql für Dimensionsgruppen

Der Parameter sql für eine dimension_group kann einen beliebigen gültigen SQL-Ausdruck enthalten, der Daten in einem der folgenden Formate enthält: Zeitstempel, Datum/Uhrzeit, Datum, Epoche oder jjjjmmtt.

sql für Maße

Der sql-Block für Messwerte hat in der Regel eine von zwei Formen:

  • Die SQL, über die eine Aggregatfunktion (z. B. COUNT, SUM, AVG) ausgeführt wird, auch hier mit dem Substitutionsoperator von Looker, wie oben beschrieben
  • Ein Wert, der auf mehreren anderen Messwerten basiert

Um den Gesamtumsatz in Dollar zu berechnen, verwenden wir beispielsweise:

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

Zur Berechnung des Gesamtgewinns können wir:

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

Weitere Informationen finden Sie in der Dokumentation für einen bestimmten Messtyp.

Für den Messwerttyp count können Sie den Parameter sql weglassen.

Bei anderen Arten von Maßnahmen gilt: Wenn sql nicht angegeben ist, geht Looker davon aus, dass in der zugrunde liegenden Tabelle eine Spalte mit demselben Namen wie das Feld vorhanden ist. Da ein Messwert einen Namen haben sollte, der angibt, dass er aus einer Gruppe von zugrunde liegenden Werten besteht, sollten Sie in der Praxis immer den Parameter sql angeben.

Mathematikaufgaben mit SQL

Innerhalb des sql-Parameters gibt es zwei häufige Probleme, die sich aus der Division ergeben.

Erstens: Wenn Sie in der Berechnung die Division verwenden, sollten Sie vermeiden, dass durch die Division eine Null entsteht, die einen SQL-Fehler verursacht. Verwenden Sie dazu die SQL-Funktion NULLIF. Beispiel: „Wenn der Nenner null ist, sollten Sie ihn stattdessen wie NULL behandeln:“

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

Ein weiteres Problem ist die Art und Weise, wie SQL Ganzzahlen verarbeitet. Wenn man 5 durch 2 teilt, erwartet man, dass das Ergebnis 2,5 ist. Bei vielen SQL-Dialekten wird das Ergebnis jedoch nur als 2 zurückgegeben, da bei der Teilung zweier Ganzzahlen das Ergebnis als Ganzzahl zurückgegeben wird. Zur Lösung dieses Problems können Sie den Zähler mit einer Dezimalzahl multiplizieren, um zu erzwingen, dass SQL ein Dezimalergebnis zurückgibt. Beispiel:

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

Flüssigkeitsvariablen mit sql

Sie können auch Liquid-Variablen mit dem Parameter sql verwenden. Mit Flüssigkeitsvariablen können Sie auf Daten wie die Werte in einem Feld, Daten zum Feld und auf das Feld angewendete Filter zugreifen.

Diese Dimension maskiert beispielsweise ein Kundenpasswort gemäß einem Looker-Nutzerattribut:

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