SUMMARIZECOLUMNS
นําไปใช้กับ: การคํานวณคอลัมน์จากการคํานวณ ตารางจากการคํานวณ หน่วยวัดภาพการคํานวณ
ส่งกลับตารางสรุปผ่านชุดของกลุ่ม
ไวยากรณ์
SUMMARIZECOLUMNS( <groupBy_columnName> [, < groupBy_columnName >]…, [<filterTable>]…[, <name>, <expression>]…)
พารามิเตอร์
เงื่อนไข | คำนิยาม |
---|---|
groupBy_columnName | การอ้างอิงคอลัมน์ที่ตรงตามหลักเกณฑ์ (Table[Column]) ไปยังตารางฐานซึ่งมีค่าเฉพาะรวมอยู่ในตารางที่ส่งกลับ แต่ละคอลัมน์ groupBy_columnName จะถูกรวมแบบไขว้ (ตารางที่แตกต่างกัน) หรือ auto-exist (ตารางเดียวกัน) กับคอลัมน์ที่ระบุในภายหลัง |
filterTable | นิพจน์ตารางที่เพิ่มลงในบริบทตัวกรองของคอลัมน์ทั้งหมดที่ระบุเป็นอาร์กิวเมนต์ groupBy_columnName ค่าที่ปรากฏในตารางตัวกรองจะถูกใช้เพื่อกรองก่อนดําเนินการ cross-join/auto-exist |
ชื่อ | สตริงที่แทนชื่อคอลัมน์ที่จะใช้สําหรับนิพจน์ที่ระบุตามมาในภายหลัง |
สีหน้า | นิพจน์ DAX ใด ๆ ที่แสดงเป็นค่าเดียว (ไม่ใช่ตาราง) |
ค่าที่ส่งกลับ
ตารางซึ่งรวมถึงชุดของค่าจากคอลัมน์ที่ให้มา โดยขึ้นอยู่กับการจัดกลุ่มที่ระบุ เฉพาะแถวที่มีนิพจน์ที่ให้มาอย่างน้อยหนึ่งรายการส่งกลับค่าที่ไม่ว่างจะรวมอยู่ในตารางที่ส่งกลับ ถ้านิพจน์ทั้งหมดประเมินเป็น BLANK/NULL สําหรับแถว แถวนั้นจะไม่รวมอยู่ในตารางที่ส่งกลับ
หมายเหตุ
ฟังก์ชันนี้ไม่รับประกันลําดับการจัดเรียงใด ๆ สําหรับผลลัพธ์
ไม่สามารถระบุคอลัมน์ได้มากกว่าหนึ่งครั้งในพารามิเตอร์ groupBy_columnName ตัวอย่างเช่น สูตรต่อไปนี้ไม่ถูกต้อง
SUMMARIZECOLUMNS( Sales[StoreId], Sales[StoreId] )
ฟังก์ชันนี้ไม่ได้รับการสนับสนุนสําหรับการใช้งานในโหมด DirectQuery เมื่อใช้ในคอลัมน์จากการคํานวณหรือกฎการรักษาความปลอดภัยระดับแถว (RLS)
บริบทตัวกรอง
พิจารณาคิวรีต่อไปนี้:
SUMMARIZECOLUMNS (
'Sales Territory'[Category],
FILTER('Customer', 'Customer' [First Name] = "Alicia")
)
ในคิวรีนี้ คอลัมน์ groupBy ซึ่งไม่มีหน่วยวัด จะไม่มีคอลัมน์ใดก็ตามจากนิพจน์ FILTER (ตัวอย่างเช่น จากตาราง Customer) ตัวกรองจะไม่ถูกนําไปใช้กับคอลัมน์ groupBy ตาราง Sales Territory และตาราง Customer อาจสัมพันธ์กันทางอ้อมผ่านตารางข้อมูลการขายของผู้ค้าปลีก (Reseller sales fact) เนื่องจากไม่เกี่ยวข้องโดยตรง นิพจน์ตัวกรองคือ no-op และคอลัมน์ groupBy จะไม่ได้รับผลกระทบ
อย่างไรก็ตาม ด้วยคิวรีนี้:
SUMMARIZECOLUMNS (
'Sales Territory'[Category], 'Customer' [Education],
FILTER('Customer', 'Customer'[First Name] = "Alicia")
)
คอลัมน์ groupBy มีคอลัมน์ที่ได้รับผลกระทบจากตัวกรองและตัวกรองนั้นจะถูกนําไปใช้กับผลลัพธ์ groupBy
มี IGNORE
สามารถใช้ไวยากรณ์ IGNORE เพื่อปรับเปลี่ยนลักษณะการทํางานของฟังก์ชัน SUMMARIZECOLUMNS ได้โดยไม่ใช้นิพจน์เฉพาะจากการประเมิน BLANK/NULL แถวที่นิพจน์ทั้งหมดไม่ได้ใช้ IGNORE ส่งกลับ BLANK/NULL จะถูกแยกออกโดยไม่ขึ้นอยู่กับว่านิพจน์ที่ใช้ IGNORE ประเมินค่าเป็น BLANK/NULL หรือไม่ สามารถใช้ IGNORE ภายในนิพจน์ SUMMARIZECOLUMNS ได้เท่านั้น
ตัวอย่าง
SUMMARIZECOLUMNS(
Sales[CustomerId], "Total Qty",
IGNORE( SUM( Sales[Qty] ) ),
"BlankIfTotalQtyIsNot3", IF( SUM( Sales[Qty] )=3, 3 )
)
ขั้นตอนนี้จะ rolls up คอลัมน์ Sales[CustomerId] สร้างผลรวมย่อยสําหรับลูกค้าทั้งหมดในการจัดกลุ่มที่กําหนด หากไม่มี IGNORE ผลลัพธ์คือ:
รหัสลูกค้า | ผลรวมปริมาณ | BlankIfTotalQtyIsNot3 |
---|---|---|
ท | 5 | |
B | 3 | 3 |
C | 3 | 3 |
ที่มี IGNORE
รหัสลูกค้า | ผลรวมปริมาณ | BlankIfTotalQtyIsNot3 |
---|---|---|
B | 3 | 3 |
C | 3 | 3 |
นิพจน์ทั้งหมดถูกละเว้น
SUMMARIZECOLUMNS(
Sales[CustomerId], "Blank",
IGNORE( BLANK() ), "BlankIfTotalQtyIsNot5",
IGNORE( IF( SUM( Sales[Qty] )=5, 5 ) )
)
แม้ว่านิพจน์ทั้งสองจะส่งกลับค่าว่างสําหรับบางแถว แต่ก็ยังรวมอยู่เนื่องจากไม่มีนิพจน์ที่ไม่ละเว้นซึ่งส่งกลับค่าว่าง
รหัสลูกค้า | ว่างเปล่า | BlankIfTotalQtyIsNot5 |
---|---|---|
ท | 5 | |
B | ||
C |
ที่มี NONVISUAL
ฟังก์ชัน NONVISUAL ทําเครื่องหมายตัวกรองค่าในฟังก์ชัน SUMMARIZECOLUMNS ว่าไม่มีผลกระทบต่อค่าหน่วยวัด แต่จะใช้กับคอลัมน์ groupBy เท่านั้น สามารถใช้ NONVISUAL ภายในนิพจน์ SUMMARIZECOLUMNS ได้เท่านั้น
ตัวอย่าง
DEFINE
MEASURE FactInternetSales[Sales] = SUM(FactInternetSales[Sales Amount])
EVALUATE
SUMMARIZECOLUMNS
(
DimDate[CalendarYear],
NONVISUAL(TREATAS({2007, 2008}, DimDate[CalendarYear])),
"Sales", [Sales],
"Visual Total Sales", CALCULATE([Sales], ALLSELECTED(DimDate[CalendarYear]))
)
ORDER BY [CalendarYear]
ส่งกลับผลลัพธ์ที่ [Visual Total Sales] เป็นผลรวมของทุกปี:
DimDate[CalendarYear] | [Sales] | [Visual Total Sales] |
---|---|---|
2007 | 9,791,060.30 | 29,358,677.22 |
2008 | 9,770,899.74 | 29,358,677.22 |
ในทางตรงกันข้าม คิวรี เดียวกันที่ไม่มี ฟังก์ชัน NONVISUAL:
DEFINE
MEASURE FactInternetSales[Sales] = SUM(FactInternetSales[Sales Amount])
EVALUATE
SUMMARIZECOLUMNS
(
DimDate[CalendarYear],
TREATAS({2007, 2008}, DimDate[CalendarYear]),
"Sales", [Sales],
"Visual Total Sales", CALCULATE([Sales], ALLSELECTED(DimDate[CalendarYear]))
)
ORDER BY [CalendarYear]
ส่งกลับผลลัพธ์โดยที่ [Visual Total Sales] เป็นผลรวมตลอดสองปีที่เลือก:
DimDate[CalendarYear] | [Sales] | [Visual Total Sales] |
---|---|---|
2007 | 9,791,060.30 | 19,561,960.04 |
2008 | 9,770,899.74 | 19,561,960.04 |
ที่มี ROLLUPADDISSUBTOTAL
การเพิ่ม ไวยากรณ์ ROLLUPADDISSUBTOTAL จะปรับเปลี่ยนลักษณะการทํางานของฟังก์ชัน SUMMARIZECOLUMNS โดยการเพิ่มแถวค่าสะสม/ผลรวมย่อยลงในผลลัพธ์ตามคอลัมน์ groupBy_columnName สามารถใช้ ROLLUPADDISSUBTOTAL ภายในนิพจน์ SUMMARIZECOLUMNS ได้เท่านั้น
ตัวอย่างที่มีผลรวมย่อยเดียว
DEFINE
VAR vCategoryFilter =
TREATAS({"Accessories", "Clothing"}, Product[Category])
VAR vSubcategoryFilter =
TREATAS({"Bike Racks", "Mountain Bikes"}, Product[Subcategory])
EVALUATE
SUMMARIZECOLUMNS
(
ROLLUPADDISSUBTOTAL
(
Product[Category], "IsCategorySubtotal", vCategoryFilter,
Product[Subcategory], "IsSubcategorySubtotal", vSubcategoryFilter
),
"Total Qty", SUM(Sales[Qty])
)
ORDER BY
[IsCategorySubtotal] DESC, [Category],
[IsSubcategorySubtotal] DESC, [Subcategory]
แสดงตารางต่อไปนี้
หมวดหมู่ | ประเภทย่อย | IsCategorySubtotal | IsSubcategorySubtotal | ผลรวมปริมาณ |
---|---|---|---|---|
จริง | จริง | 60398 | ||
อุปกรณ์ | False | จริง | 36092 | |
อุปกรณ์ | แร็คจักรยาน | เท็จ | เท็จ | 328 |
จักรยาน | จักรยานเสือภูเขา | เท็จ | เท็จ | 4970 |
เสื้อผ้า | False | จริง | 9101 |
ตัวอย่างที่มีผลรวมย่อยหลายรายการ
SUMMARIZECOLUMNS (
Regions[State], ROLLUPADDISSUBTOTAL ( Sales[CustomerId], "IsCustomerSubtotal" ),
ROLLUPADDISSUBTOTAL ( Sales[Date], "IsDateSubtotal"), "Total Qty", SUM( Sales[Qty] )
)
ยอดขายถูกจัดกลุ่มตามรัฐ ตามลูกค้า ตามวันที่ ที่มีผลรวมย่อยเท่ากับ 1 ยอดขายตามรัฐ ตามวันที่ 2 ยอดขายตามรัฐ ตามลูกค้า 3 Roll up ทั้งลูกค้าและวันที่ซึ่งนําไปสู่ยอดขายตามรัฐ
แสดงตารางต่อไปนี้
รหัสลูกค้า (CustomerID) | IsCustomerSubtotal | State | ผลรวมปริมาณ | วันที่ | IsDateSubtotal |
---|---|---|---|---|---|
ท | เท็จ | WA | 5 | 7/10/2014 | |
B | เท็จ | WA | 1 | 7/10/2014 | |
B | เท็จ | WA | 2 | 7/11/2014 | |
C | เท็จ | หรือ | 2 | 7/10/2014 | |
C | เท็จ | หรือ | 1 | 7/11/2014 | |
TRUE | WA | 6 | 7/10/2014 | ||
TRUE | WA | 2 | 7/11/2014 | ||
TRUE | หรือ | 2 | 7/10/2014 | ||
TRUE | หรือ | 1 | 7/11/2014 | ||
ท | เท็จ | WA | 5 | TRUE | |
B | เท็จ | WA | 3 | TRUE | |
C | เท็จ | หรือ | 3 | TRUE | |
TRUE | WA | 8 | TRUE | ||
TRUE | หรือ | 3 | TRUE |
ที่มี ROLLUPGROUP
เช่นเดียวกับฟังก์ชัน SUMMARIZE คุณสามารถใช้ ROLLUPGROUP ร่วมกับ ROLLUPADDISSUBTOTAL เพื่อระบุว่ากลุ่มสรุป/ความละเอียดของจุดข้อมูล (ผลรวมย่อย) ใดที่จะรวมอยู่ด้วย (ลดจํานวนแถวผลรวมย่อยที่ส่งกลับ) สามารถใช้ ROLLUPGROUP ภายในนิพจน์ SUMMARIZECOLUMNS หรือ SUMMARIZE ได้เท่านั้น
ตัวอย่างที่มีผลรวมย่อยหลายรายการ
SUMMARIZECOLUMNS(
ROLLUPADDISSUBTOTAL( Sales[CustomerId], "IsCustomerSubtotal" ),
ROLLUPADDISSUBTOTAL(ROLLUPGROUP(Regions[City], Regions[State]), "IsCityStateSubtotal"),"Total Qty", SUM( Sales[Qty] )
)
ยังจัดกลุ่มตามเมืองและรัฐ แต่รวมเข้าด้วยกันเมื่อรายงานผลรวมย่อยส่งกลับตารางต่อไปนี้
State | รหัสลูกค้า | IsCustomerSubtotal | ผลรวมปริมาณ | City | IsCityStateSubtotal |
---|---|---|---|---|---|
WA | ท | เท็จ | 2 | เบลวิลล์ | เท็จ |
WA | B | เท็จ | 2 | เบลวิลล์ | เท็จ |
WA | ท | เท็จ | 3 | Redmond | เท็จ |
WA | B | เท็จ | 1 | Redmond | เท็จ |
หรือ | C | เท็จ | 3 | พอร์ตแลนด์ | เท็จ |
WA | TRUE | 4 | เบลวิลล์ | เท็จ | |
WA | TRUE | 4 | Redmond | เท็จ | |
หรือ | TRUE | 3 | พอร์ตแลนด์ | เท็จ | |
ท | เท็จ | 5 | เท็จ | ||
B | เท็จ | 3 | TRUE | ||
C | เท็จ | 3 | TRUE | ||
TRUE | 11 | TRUE |
SummarizeColumns ตามบริบท
พื้นหลัง
จนถึงเดือนกุมภาพันธ์ 2023 SUMMARIZECOLUMNS ไม่สนับสนุนการประเมินภายในการเปลี่ยนบริบทเลย ในผลิตภัณฑ์ที่เผยแพร่ก่อนเดือนนั้น ข้อจํากัดนี้ทําให้ SUMMARIZECOLUMNS ไม่มีประโยชน์ในหน่วยวัดส่วนใหญ่ – ไม่สามารถเรียกใช้หน่วยวัด SUMMARIZECOLUMNS ในกรณีใด ๆ ของการเปลี่ยนบริบท รวมถึงคําสั่ง SUMMARIZECOLUMNS อื่นๆ ได้
ตั้งแต่เดือนกุมภาพันธ์ 2023 การเปลี่ยนบริบทได้รับการสนับสนุนในบางสถานการณ์ แต่ไม่รองรับในทุกเงื่อนไข กรณีที่สนับสนุนและจํากัดมีดังนี้:
ชนิด SummarizeColumns | ตัวกรองภายนอกที่มีคอลัมน์เดียว | ตัวกรองภายนอกที่มีมากกว่าหนึ่งคอลัมน์ | คอลัมน์ GroupBy ภายนอก |
---|---|---|---|
SummarizeColumns ที่มี GroupBy เท่านั้น | ตกลง | ตกลง | ตกลง |
SummarizeColumns ที่มีตัวกรอง/หน่วยวัด | ตกลง | ความผิดพลาด | ความผิดพลาด |
ตั้งแต่เดือนมิถุนายน 2024 เรากําลังเปิดใช้งาน SummarizeColumns ตามบริบทซึ่งอนุญาตให้ SummarizeColumns ได้รับการประเมินในการเปลี่ยนแปลงบริบทใด ๆ ซึ่ง SummarizeColumns ในหน่วยวัดได้รับการสนับสนุนอย่างสมบูรณ์แล้ว:
ชนิด SummarizeColumns | ตัวกรองภายนอกที่มีคอลัมน์เดียว | ตัวกรองภายนอกที่มีมากกว่าหนึ่งคอลัมน์ | คอลัมน์ GroupBy ภายนอก |
---|---|---|---|
SummarizeColumns ที่มี GroupBy เท่านั้น | ตกลง | ตกลง | ตกลง |
SummarizeColumns ที่มีตัวกรอง/หน่วยวัด | ตกลง | ตกลง | ตกลง |
อย่างไรก็ตาม การอัปเดตนี้ยังรวมถึงการเปลี่ยนแปลงลักษณะการทํางานของ SummarizeColumns ซึ่งอาจเปลี่ยนผลลัพธ์ของนิพจน์ที่มีอยู่:
ตรรกะ SelfValue สําหรับตัวกรองภายนอก
เรากําลังแนะนําแนวคิดเชิงความหมายที่ชื่อว่า SelfValue ซึ่งจะเปลี่ยนวิธีที่ตัวกรองจากตารางภายนอกโต้ตอบกับคอลัมน์ GroupBy ใน SummarizeColumns การเปลี่ยนแปลงนี้จะไม่อนุญาตให้ตัวกรองจากตารางอื่นมีผลต่อคอลัมน์ GroupBy แม้ว่าตารางนั้นจะเกี่ยวข้องกันผ่านความสัมพันธ์แบบตัวกรองโดยก็ตาม ตัวอย่างที่แสดงผลกระทบของการเปลี่ยนแปลงนี้เกี่ยวข้องกับนิพจน์ต่อไปนี้:
CalculateTable(
SummarizeColumns(
'Reseller Sales'[ResellerKey],
'Reseller Sales'[ProductKey]
),
Treatas({(229)}, 'Product'[Product Key])
)
ก่อนการอัปเดตนี้ ตัวกรอง TreatAs จะนําไปใช้กับการดําเนินการ GroupBy ภายใน SummarizeColumns โดยใช้ประโยชน์จากความสัมพันธ์ระหว่าง 'Product'[Product Key] และ 'Reseller Sales'[ProductKey] ดังนั้น ผลลัพธ์คิวรีจะรวมเฉพาะแถวที่ 'Reseller Sales'[ProductKey] เท่ากับ 229 อย่างไรก็ตาม หลังจากการอัปเดต คอลัมน์ GroupBy ภายใน SummarizeColumns จะไม่ถูกกรองตามคอลัมน์จากตารางภายนอกอีกต่อไป แม้ว่าจะมีความสัมพันธ์ระหว่างกันก็ตาม ดังนั้น ในตัวอย่างด้านบน คอลัมน์ GroupBy 'Reseller Sales'[ProductKey] จะไม่ถูกกรองโดยคอลัมน์ 'Product'[ProductKey] ผลคิวรีจะรวมแถวที่ 'Reseller Sales'[ProductKey] ไม่เท่ากับ 229
ถ้าคุณต้องการคงลักษณะการทํางานก่อนหน้านี้ไว้ คุณสามารถเขียนนิพจน์ใหม่โดยใช้ Summarize แทน SummarizeColumns ดังที่แสดงด้านล่าง:
CalculateTable(
SUMMARIZE(
'Reseller Sales',
[ResellerKey],
[ProductKey]
),
Treatas({(229)}, 'Product'[Product Key])
)
นิพจน์การเขียนใหม่นี้จะรักษาความหมายเดิมซึ่งการดําเนินการ GroupBy ไม่ได้รับผลกระทบจากข้อจํากัด SelfValue ที่นํามาใช้โดยการอัปเดต
การตรวจสอบความถูกต้องของแถวสําหรับคอลัมน์ groupby ที่ครอบคลุมโดย Treatas อย่างสมบูรณ์
ก่อนการอัปเดตนี้ ภายในฟังก์ชัน SummarizeColumns ถ้าคอลัมน์ GroupBy ทั้งหมดจากตารางที่ระบุครอบคลุมทั้งหมดด้วยตัวกรอง Treatas เดียวจากตารางเดียวกัน ดังที่แสดงด้านล่าง:
SummarizeColumns(
Geography[Country],
Geography[State],
Treatas(
{("United States", "Alberta")},
Geography[Country],
Geography[State]
)
)
ผลลัพธ์ของคิวรีข้างต้นจะรวมแถวใดก็ตามที่ระบุไว้ในตัวกรอง Treatas โดยไม่คํานึงถึงว่าแถวเหล่านั้นถูกต้องหรือไม่ ตัวอย่างเช่น ผลลัพธ์จะเป็นตารางแบบแถวเดียว ("สหรัฐอเมริกา", "Alberta") แม้ว่าไม่มีแถวดังกล่าวที่มี [ประเทศ] = "สหรัฐอเมริกา" และ [รัฐ] = "Alberta" ที่มีอยู่ในตาราง 'Geography'
ปัญหานี้เป็นที่รู้จักและได้รับการแก้ไขจากการอัปเดต หลังจากการอัปเดต แถวที่ไม่ถูกต้องดังกล่าวจะถูกกรองออก และจะส่งกลับเฉพาะแถวที่ถูกต้องจากตาราง GroupBy เท่านั้น ดังนั้น ผลลัพธ์สําหรับคิวรีด้านบนจะว่างเปล่า เนื่องจากไม่มีแถวที่ถูกต้องที่ตรงกับค่า [Country] และ [State] ที่ระบุในตาราง 'Geography'
ไม่อนุญาตให้ Keepfilters ผสม/แทนที่ตัวกรองบนตาราง/คลัสเตอร์เดียวกัน
การอัปเดตล่าสุดได้แนะนําข้อจํากัดชั่วคราวที่ทริกเกอร์ข้อความแสดงข้อผิดพลาดที่ระบุว่า:
"SummarizeColumns filters with keepfilters behavior and overridefilters behavior are mixed within one cluster, which is not allowed. Consider adding keepfilters() to all filters of summarizecolumns."
ข้อผิดพลาดนี้เกิดขึ้นเมื่อตัวกรองปกติทั้งสอง (ซึ่งแทนที่ตัวกรองที่มีอยู่) และตัวกรองที่มี KeepFilters ที่ระบุจะปรากฏภายในตาราง/คลัสเตอร์เดียวกัน ตัวอย่างเช่น:
Evaluate CalculateTable(
SummarizeColumns(
Product[Color],
KeepFilters(
TreatAs(
{( "Washington")}
, Geography[State]
)
),
TreatAs(
{("United States"), ("Canada")}
, Geography[Country]
)
)
,TreatAs({("Alberta")}, Geography[State])
,TreatAs({("Canada")}, Geography[Country])
)
ในนิพจน์ข้างต้น มีตัวกรองสองตัวในตาราง 'ภูมิศาสตร์': ตัวกรองหนึ่งตัวที่มี KeepFilters ระบุและอีกตัวกรองหนึ่งไม่มี ตัวกรองเหล่านี้ทับซ้อนกับตัวกรองภายนอกบนคอลัมน์ที่แตกต่างกัน ในขณะนี้ การกําหนดค่านี้ไม่ได้รับอนุญาตเนื่องจากภายใน ตัวกรองทั้งสองจะถูกคลัสเตอร์เป็นหนึ่ง และระบบไม่สามารถกําหนดลักษณะการทํางานแทนที่ตัวกรองแบบคลัสเตอร์สําหรับกรณีดังกล่าวโดยรวม
โปรดทราบว่าข้อจํากัดนี้เป็นแบบชั่วคราว เรากําลังพัฒนาโซลูชันเพื่อลบข้อจํากัดนี้ในการอัปเดตในอนาคต ถ้าคุณพบข้อผิดพลาดนี้ เราขอแนะนําให้ปรับตัวกรองภายใน SummarizeColumns โดยการเพิ่มหรือลบ KeepFilters ตามที่จําเป็นเพื่อให้แน่ใจว่าลักษณะการทํางานแทนที่แต่ละตารางสอดคล้องกัน