-- 地域固有のビジネスロジックの例
SELECT
order_id,
CASE /param/region
WHEN 'EU' THEN amount * 1.20 -- EU: 20% VAT
ELSE amount
END as final_price,
CASE /param/region
WHEN 'EU' THEN 'EU'
ELSE 'Other'
END as tax_region
FROM orders
-- 集計粒度の例
SELECT
CASE /param/granularity
WHEN 'daily' THEN DATE_TRUNC('day', timestamp)
WHEN 'weekly' THEN DATE_TRUNC('week', timestamp)
ELSE DATE_TRUNC('month', timestamp)
END as period
FROM events
-- 権限ベースの制限の例
SELECT * FROM (
SELECT sensitive_column as data FROM sensitive_data WHERE /param/is_admin = TRUE
UNION ALL
SELECT public_column as data FROM filtered_data WHERE /param/is_admin = FALSE
) t
テンプレートエンジンのアプローチ(Codatumでは使用不可)
参考までに、テンプレートエンジン(Jinja2)では以下のように実装されます:
-- 地域固有のビジネスロジックの例
{% if region == 'EU' %}
SELECT
order_id,
amount * 1.20 as price_with_vat, -- EU: 20% VAT
'EU' as tax_region
FROM orders
{% else %}
SELECT
order_id,
amount as price_without_vat,
'Other' as tax_region
FROM orders
{% endif %}
-- 集計粒度の例
SELECT
{% if granularity == 'daily' %}
DATE_TRUNC('day', timestamp) as period
{% elif granularity == 'weekly' %}
DATE_TRUNC('week', timestamp) as period
{% else %}
DATE_TRUNC('month', timestamp) as period
{% endif %}
FROM events
-- 権限ベースの制限の例
{% if user.is_admin %}
SELECT * FROM sensitive_data
{% else %}
SELECT public_columns FROM filtered_data
{% endif %}
2. オプションのフィルター条件(If/Else)
Parameterに基づいて、WHERE句に含める条件を制御します。
ユースケース
ユーザーが検索条件を柔軟に組み合わせられるようにする
レポートのフィルターを動的に変更する
特定の条件が提供された場合にのみフィルターを適用する
Codatumのアプローチ
空Parameterの処理を使用します:
SELECT * FROM orders
WHERE 1=1
AND (order_date >= /param/start_date OR /param/start_date = '1970-01-01')
AND (status = /param/status OR /param/status = '')
テンプレートエンジンのアプローチ(Codatumでは使用不可)
参考までに、テンプレートエンジン(Jinja2)では以下のように実装されます:
SELECT * FROM orders
WHERE 1=1
{% if start_date %}
AND order_date >= {{start_date}}
{% endif %}
{% if status %}
AND status = {{status}}
{% endif %}
3. マルチパラメータによる繰り返し(For Loop)
Multi Input/Select Parameterを使用して繰り返しパターンを適用します。
ユースケース
複数のメトリクスを同時に集計する
ユーザーが選択したメトリクスのみを表示する
複数の列に類似の計算ロジックを適用する
Codatumのアプローチ
Text Multi Input ParameterとCASE式を使用します:
SELECT
SUM(CASE WHEN 'revenue' IN (/param/selected_metrics) THEN revenue ELSE NULL END) as revenue_total,
SUM(CASE WHEN 'cost' IN (/param/selected_metrics) THEN cost ELSE NULL END) as cost_total,
SUM(CASE WHEN 'profit' IN (/param/selected_metrics) THEN profit ELSE NULL END) as profit_total
FROM sales
-- APIキーベースのテーブル選択
SELECT * FROM `api_logs_{{api_version}}`
-- 日付パーティションテーブルへのアクセス
SELECT * FROM `events_{{date.strftime('%Y%m%d')}}`
-- 動的な列名
SELECT
{{metric_name}} as metric,
amount_{{currency}} as amount
FROM transactions
5. マクロ/関数の再利用
再利用可能な計算ロジックを関数にカプセル化します。
ユースケース
ドメイン固有の計算ロジックを標準化する
複数のクエリで計算ロジックを再利用する
複雑な条件付き計算をカプセル化する
Codatumのアプローチ(BigQuery UDFを使用)
-- LTV計算関数
CREATE TEMP FUNCTION calculate_ltv(revenue FLOAT64, acquisition_cost FLOAT64, retention_months INT64)
RETURNS FLOAT64
AS (
CASE
WHEN retention_months = 0 THEN 0.0
ELSE (revenue - acquisition_cost) * POWER(0.95, retention_months)
END
);
SELECT
user_id,
calculate_ltv(total_revenue, acquisition_cost, months_active) as ltv,
FROM user_metrics
UDFはデータベース固有の機能であり、表記法と機能はデータベースによって異なります。
テンプレートエンジンのアプローチ(Codatumでは使用不可)
参考までに、テンプレートエンジン(Jinja2)では以下のように実装されます:
{% macro calculate_ltv(revenue, acquisition_cost, retention_months) %}
CASE
WHEN {{retention_months}} = 0 THEN 0
ELSE ({{revenue}} - {{acquisition_cost}}) *
POWER(0.95, {{retention_months}}) -- 5%の減衰率を適用
END
{% endmacro %}
SELECT
user_id,
{{ calculate_ltv('total_revenue', 'acquisition_cost', 'months_active') }} as ltv
FROM user_metrics