‫SQL (לשדות)

בדף הזה מוסבר על הפרמטר sql שהוא חלק משדה.

אפשר להשתמש ב-sql גם כחלק מטבלה נגזרת, כמו שמתואר בדף התיעוד של הפרמטר sql (לטבלאות נגזרות).

Usage

view: view_name {
  dimension: field_name {
    sql: ${revenue_in_dollars} - ${inventory_item.cost_in_dollars} ;;
  }
}
היררכיה
sql
סוגי שדות אפשריים
מאפיין, קבוצת מאפיינים, מסנן, מדד

מקבל
ביטוי SQL

כללים מיוחדים
ביטוי SQL שמשתנה בהתאם לtype של השדה (כפי שמתואר בפירוט בדף התיעוד הזה)

הגדרה

הפרמטר sql מקבל כמה סוגים של ביטויי SQL שיגדירו מאפיין, מדד או מסנן. הביטוי שצריך לכתוב משתנה בהתאם לסוג השדה שיוצרים. פרטים נוספים על סוגי מאפיינים ומסננים זמינים בדף התיעוד סוגי מאפיינים, מסננים ופרמטרים, ופרטים נוספים על סוגי מדדים זמינים בדף התיעוד סוגי מדדים. אפשר לעיין גם בדף המסמכים בנושא שילוב של SQL והפניה לאובייקטים של LookML.

sql למאפיינים

בלוק sql של מאפיינים יכול בדרך כלל לקבל כל SQL תקין שיופיע בעמודה אחת של הצהרת SELECT. ההצהרות האלה מסתמכות בדרך כלל על אופרטור ההחלפה של Looker, שמופיע בכמה צורות:

  • ${TABLE}.column_name מפנה לעמודה בטבלה שמקושרת לתצוגה שאתם עובדים עליה.
  • ${dimension_name} מתייחס למאפיין בתצוגה שאתם עובדים עליה.
  • ${view_name.dimension_name} מתייחס למאפיין מתצוגה אחרת.
  • ${view_name.SQL_TABLE_NAME} מפנה לתצוגה אחרת או לטבלה נגזרת. (שימו לב: SQL_TABLE_NAME בהפניה הזו הוא מחרוזת מילולית, ואין צורך להחליף אותו בשום דבר).

אם לא מציינים את sql, ‏ Looker מניח שיש עמודה בטבלה הבסיסית עם אותו שם כמו השדה. לדוגמה, בחירת שדה בשם city ללא הפרמטר sql תהיה שוות ערך לציון sql: ${TABLE}.city.

הפרמטר sql של מאפיין לא יכול לכלול צבירות. כלומר, אי אפשר להשתמש בו באגרגציות של SQL או בהפניות למדדים של LookML. אם רוצים ליצור שדה עם sql שכולל צבירת SQL או שמפנה למדד LookML, צריך להשתמש בפרמטר sql במדד, ולא במאפיין.

מאפיין פשוט מאוד שמקבל את הערך ישירות מעמודה בשם revenue יכול להיראות כך:

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

מאפיין שמתבסס על מאפיין אחר באותו תצוגה יכול להיראות כך:

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

מאפיין שמסתמך על מאפיין אחר בתצוגה שונה יכול להיראות כך:

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

מאפיין שמסתמך על מאפיין אחר בטבלה נגזרת יכול להיראות כך:

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

משתמשי SQL מתקדמים יותר יכולים לבצע חישובים מתקדמים יחסית, כולל שאילתות משנה מתואמות (הערה: לא כל ניב של מסד נתונים תומך בשאילתות משנה מתואמות):

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

פרטים נוספים מופיעים במאמרי העזרה בנושא סוג מסוים של מאפיין.

sql לקבוצות מאפיינים

הפרמטר sql של dimension_group מקבל כל ביטוי SQL תקין שמכיל נתונים בפורמט של חותמת זמן, תאריך ושעה, תאריך, ראשית זמן או yyyymmdd.

sql for Measures

הבלוק sql של מדדים בדרך כלל מופיע באחת משתי צורות:

  • שאילתת ה-SQL שפונקציית צבירה (כמו COUNT,‏ SUM,‏ AVG) תופעל עליה, שוב באמצעות אופרטור ההחלפה של Looker, כפי שמתואר בקטע SQL for Dimensions
  • ערך שמבוסס על כמה מדדים אחרים

לדוגמה, כדי לחשב את סך ההכנסות בדולרים, אפשר להשתמש בנוסחה הבאה:

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

כדי לחשב את הרווח הכולל, אפשר להשתמש בנוסחה:

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

פרטים נוספים זמינים במאמרי העזרה בנושא סוגים ספציפיים של מדדים.

במקרה של count measure type, אפשר להשמיט את הפרמטר sql.

בסוגים אחרים של מדדים, אם לא מציינים את sql, מערכת Looker מניחה שיש עמודה בטבלה הבסיסית עם אותו שם כמו השדה. מאחר שלמדד צריך להיות שם שמציין שהוא סיכום של קבוצת ערכים בסיסית, בפועל תמיד צריך לכלול פרמטר sql.

אתגרים מתמטיים ב-SQL

יש שני אתגרים נפוצים שקשורים לחלוקה בפרמטר sql.

קודם כל, אם אתם משתמשים בפעולת חילוק בחישוב, כדאי להגן על עצמכם מפני אפשרות של חלוקה באפס, שתגרום לשגיאת SQL. כדי לעשות את זה, משתמשים בפונקציה NULLIF של SQL. לדוגמה, המשמעות של הדוגמה הבאה היא 'אם המכנה הוא אפס, צריך להתייחס אליו כאילו הוא NULL':

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

בעיה נוספת היא האופן שבו SQL מטפל במתמטיקה של מספרים שלמים. אם מחלקים 5 ב-2, רוב האנשים מצפים שהתוצאה תהיה 2.5. עם זאת, בהרבה ניבי SQL התוצאה תהיה רק 2, כי כשמחלקים שני מספרים שלמים, התוצאה היא גם מספר שלם. כדי לפתור את הבעיה, אפשר להכפיל את המונה במספר עשרוני כדי לחייב את SQL להחזיר תוצאה עשרונית. לדוגמה:

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

משתני Liquid עם sql

אפשר גם להשתמש במשתני Liquid עם הפרמטר sql. משתני Liquid מאפשרים לכם לגשת לנתונים כמו הערכים בשדה, נתונים על השדה ומסננים שהוחלו על השדה.

לדוגמה, המימד הזה מסתיר סיסמת לקוח בהתאם למאפיין משתמש ב-Looker:

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