แชร์ผ่าน


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 ตามที่จําเป็นเพื่อให้แน่ใจว่าลักษณะการทํางานแทนที่แต่ละตารางสอดคล้องกัน

สรุป