Metabase

SumIf

تابع SumIf مجموع مقادیر یک ستون را مشروط به یک شرط حساب می‌کند.

نحو کلی: SumIf(column, condition)

مثال: در جدول زیر، عبارت SumIf([Payment], [Plan] = "Basic") مقدار 200 را برمی‌گرداند.

PaymentPlan
100Basic
100Basic
200Business
200Business
400Premium

فرمول‌های تجمیعی مثل sumif باید در منوی SummarizeCustom Expression اضافه شوند (در صورت نیاز اسکرول کنید).

پارامترها

  • column: نام یک ستون عددی، یا یک تابع که ستون عددی برمی‌گرداند.
  • condition: یک تابع یا عبارت شرطی که مقدار بولی (true یا false) برمی‌گرداند؛ مانند [Payment] > 100.

چند شرط (Multiple conditions)

برای نشان‌دادن حالت‌های مختلف SumIf (شرط‌های الزامی، اختیاری و ترکیبی) از جدول نمونهٔ زیر استفاده می‌کنیم:

PaymentPlanDate Received
100BasicOctober 1, 2020
100BasicOctober 1, 2020
200BusinessOctober 1, 2020
200BusinessNovember 1, 2020
400PremiumNovember 1, 2020

شرط‌های الزامی (Required)

برای جمع‌زدن ستون بر اساس چند شرط الزامی، شرط‌ها را با عملگر AND ترکیب کنید:

SumIf([Payment], ([Plan] = "Basic" AND month([Date Received]) = 10))

در دادهٔ نمونه، این عبارت مجموع پرداخت‌های مربوط به پلن Basic در ماه اکتبر (۲۰۰) را برمی‌گرداند.

شرط‌های اختیاری (Optional)

برای جمع‌زدن ستون با چند شرط اختیاری، شرط‌ها را با OR ترکیب کنید:

SumIf([Payment], ([Plan] = "Basic" OR [Plan] = "Business"))

در دادهٔ نمونه، این عبارت مقدار 600 را برمی‌گرداند.

ترکیبی از شرط‌های الزامی و اختیاری

برای ترکیب شرط‌های الزامی و اختیاری، حتماً از پرانتز استفاده کنید:

SumIf([Payment], ([Plan] = "Basic" OR [Plan] = "Business") AND month([Date Received]) = 10)

در دادهٔ نمونه، این عبارت مقدار 400 را برمی‌گرداند.

نکته: عادت کنید همیشه دور گروه‌های AND و OR پرانتز بگذارید تا ناخواسته شرط اجباری را اختیاری (یا برعکس) نکنید.

زیرجمع‌های شرطی بر اساس Group

برای به‌دست‌آوردن زیرجمع‌های شرطی بر اساس دسته (مثلاً مجموع پرداخت‌ها به‌ازای هر پلن):

  1. یک فرمول SumIf با شرط‌های موردنظر بنویسید.
  2. یک ستون Group by در Query builder اضافه کنید.

با دادهٔ نمونه:

PaymentPlanDate Received
100BasicOctober 1, 2020
100BasicOctober 1, 2020
200BusinessOctober 1, 2020
200BusinessNovember 1, 2020
400PremiumNovember 1, 2020

برای جمع‌زدن پرداخت‌های پلن‌های Business و Premium:

SumIf([Payment], [Plan] = "Business" OR [Plan] = "Premium")

یا برای جمع‌زدن همهٔ پلن‌هایی که Basic نیستند:

SumIf([Payment], [Plan] != "Basic")

عملگر «نامساوی» را باید به‌صورت != بنویسید.

برای دیدن این مجموع‌ها به‌تفکیک ماه، ستون Group by را روی "Date Received: Month" قرار دهید:

Date Received: MonthTotal Payments for Business and Premium Plans
October200
November600

نکته: برای خوانایی بیش‌تر، هنگام به‌اشتراک‌گذاشتن تحلیل با دیگران، استفاده از فیلتر OR (مثلاً Plan = Basic OR Plan = Business) معمولاً شفاف‌تر از != است، چون دقیقاً نشان می‌دهد کدام دسته‌ها در جمع لحاظ شده‌اند.

انواع دادهٔ قابل قبول

نوع دادهسازگار با SumIf
String
Number
Timestamp
Boolean
JSON

جزئیات بیش‌تر را در بخش پارامترها ببینید.

توابع مرتبط

روش‌های مختلف برای رسیدن به همان نتیجه؛ چون هنوز بخش بزرگی از دنیا با CSV کار می‌کند.

در خود متابیس

در ابزارهای دیگر

case

می‌توانید Sum و case را ترکیب کنید:

Sum(case([Plan] = "Basic", [Payment]))

که همان کار زیر را انجام می‌دهد:

SumIf([Payment], [Plan] = "Basic")
``>

مزیت نسخهٔ `case` این است که می‌توانید در صورت برقرار نبودن شرط، ستون دیگری را جمع بزنید.  
مثلاً می‌توانید ستونی به نام `Revenue` بسازید که:

- وقتی `Plan = Basic` است، ستون `Payment` را جمع می‌زند، و
- در غیر این صورت، ستون `Contract` را.

```text
sum(case([Plan] = "Basic", [Payment], [Contract]))

CumulativeSum

SumIf خودش مجموع تجمعی (Running total) تولید نمی‌کند. برای این کار باید تجمیع CumulativeSum را با عبارت case ترکیب کنید.

مثلاً برای به‌دست‌آوردن Running total پرداخت‌های Business و Premium به‌تفکیک ماه (با استفاده از دادهٔ نمونهٔ پرداخت‌ها):

Date Received: MonthTotal Payments for Business and Premium Plans
October200
November800

یک تجمیع از مسیر Summarize > Custom expression بسازید:

CumulativeSum(case(([Plan] = "Business" OR [Plan] = "Premium"), [Payment], 0))

و Group by را روی "Date Received: Month" ست کنید.

SQL

وقتی سؤالی را با Query builder اجرا می‌کنید، متابیس آن را به SQL تبدیل کرده و روی دیتابیس اجرا می‌کند.

اگر دادهٔ نمونهٔ پرداخت‌ها را در دیتابیس PostgreSQL ذخیره کرده باشید، کوئری زیر:

SELECT
    SUM(CASE WHEN plan = 'Basic' THEN payment ELSE 0 END) AS total_payments_basic
FROM invoices

معادل عبارت زیر در متابیس است:

SumIf([Payment], [Plan] = "Basic")

برای اضافه‌کردن چند شرط همراه با Group by:

SELECT
    DATE_TRUNC('month', date_received)                       AS date_received_month,
    SUM(CASE WHEN plan = 'Business' OR plan = 'Premium'
             THEN payment ELSE 0 END) AS total_payments_business_or_premium
FROM invoices
GROUP BY
    DATE_TRUNC('month', date_received)

بخش SELECT این کوئری معادل عبارت زیر در متابیس است:

SumIf([Payment], [Plan] = "Business" OR [Plan] = "Premium")

و بخش GROUP BY معادل تنظیم ستون Group by روی "Date Received: Month" است.

Spreadsheets

اگر دادهٔ نمونهٔ پرداخت‌ها را در Spreadsheet داشته باشید و ستون "Payment" در ستون A و "Plan" در ستون B باشد، فرمول زیر:

=SUMIF(B:B, "Basic", A:A)

همان نتیجه‌ای را تولید می‌کند که:

SumIf([Payment], [Plan] = "Basic")

برای افزودن شرط‌های بیش‌تر، معمولاً باید سراغ فرمول‌های Array در Spreadsheet بروید.

Python

اگر دادهٔ نمونهٔ پرداخت‌ها را در یک DataFrame pandas به نام df داشته باشید، کد زیر:

df.loc[df['Plan'] == "Basic", 'Payment'].sum()

معادل عبارت زیر در متابیس است:

SumIf([Payment], [Plan] = "Basic")

برای اضافه‌کردن چند شرط همراه با Group by:

import datetime as dt

# اختیاری: تبدیل ستون به datetime
df['Date Received'] = pd.to_datetime(df['Date Received'])

# استخراج ماه
df['Date Received: Month'] = df['Date Received'].dt.to_period('M')

# اعمال شرط‌ها
df_filtered = df[(df['Plan'] == 'Business') | (df['Plan'] == 'Premium')]

# جمع و Group by
df_filtered.groupby('Date Received: Month')['Payment'].sum()

این مراحل همان نتیجه‌ای را تولید می‌کنند که این عبارت متابیس (با Group by روی "Date Received: Month"):

SumIf([Payment], [Plan] = "Business" OR [Plan] = "Premium")

مطالعهٔ بیشتر