กำหนดช่วงแบบไดนามิกในมิติข้อมูล


18

ฉันมีปัญหาที่ฉันเผชิญทุกครั้งที่ฉันตัดสินใจที่จะสร้างคิวบ์และฉันยังไม่พบวิธีที่จะเอาชนะมันได้

ปัญหาคือวิธีการอนุญาตให้ผู้ใช้กำหนดช่วงของสิ่งต่าง ๆ โดยอัตโนมัติโดยไม่จำเป็นต้อง hardcode พวกเขาในมิติ ฉันจะอธิบายปัญหาของฉันในตัวอย่าง

ฉันมีตารางชื่อลูกค้า :

โครงสร้างตาราง

นี่คือข้อมูลในตาราง:

ตารางที่มีข้อมูล

ฉันต้องการแสดงข้อมูลในรูปแบบ pivot และจัดกลุ่มเงินเดือนและอายุในช่วงที่กำหนดดังนี้:

ตารางที่มีข้อมูลที่มีช่วงที่กำหนด

ฉันเขียนสคริปต์นี้และกำหนดช่วง:

SELECT [CustId]
      ,[CustName]
      ,[Age]
      ,[Salary]
      ,[SalaryRange] = case
        when cast(salary as float) <= 500 then
            '0 - 500'
        when cast(salary as float) between 501 and 1000 then
            '501 - 1000'
        when cast(salary as float) between 1001 and 2000 then
            '1001 - 2000'
        when cast(salary as float) > 2000 then
            '2001+'
        end,
        [AgeRange] = case
        when cast(age as float) < 15 then
            'below 15'
        when cast(age as float) between 15 and 19 then
            '15 - 19'
        when cast(age as float) between 20 and 29 then
            '20 - 29'               
        when cast(age as float) between 30 and 39 then
            '30 - 39'
        when cast(age as float) >= 40 then
            '40+'
        end
  FROM [Customers]
GO

ช่วงของฉันเขียนได้ยากและถูกกำหนดไว้ เมื่อฉันคัดลอกข้อมูลไปยัง Excel และดูในตารางเดือยมันจะปรากฏขึ้นด้านล่าง:

ข้อมูลใน Pivot Table

ปัญหาของฉันคือผมต้องการสร้างก้อนโดยการแปลงลูกค้าตารางลงในตารางความจริงและสร้างตาราง 2 มิติSalaryDim & AgeDim

SalaryDimตารางมี 2 คอลัมน์ ( SalaryKey, SalaryRange ) และAgeDimตารางคล้ายกัน ( ageKey, ช่วงอายุ ) ตารางข้อเท็จจริงลูกค้าของฉันมี:

Customer
[CustId]
[CustName]
[AgeKey] --> foreign Key to AgeDim
[Salarykey] --> foreign Key to SalaryDim

ฉันยังต้องกำหนดช่วงของฉันภายในส่วนข้อมูลเหล่านี้ ทุกครั้งที่ฉันเชื่อมต่อเดือย Excel กับคิวบ์ของฉันฉันจะเห็นเฉพาะช่วงที่กำหนดฮาร์ดโค้ด

คำถามของฉันคือวิธีการกำหนดช่วงแบบไดนามิกจากตารางเดือยโดยตรงโดยไม่ต้องสร้างมิติที่หลากหลายเช่นAgeDimและSalaryDim ฉันไม่ต้องการติดกับช่วงที่กำหนดไว้ในมิติข้อมูลเท่านั้น

ไม่มีช่วงที่กำหนด

ช่วงที่กำหนดคือ '0-25', '26 -30 ', '31 - 50' ฉันอาจต้องการเปลี่ยนเป็น '0-20', '21 -31 ', '32 -42' และอื่น ๆ และผู้ใช้ร้องขอช่วงที่แตกต่างกันทุกครั้ง

ทุกครั้งที่ฉันเปลี่ยนฉันต้องเปลี่ยนมิติ ฉันจะปรับปรุงกระบวนการนี้ได้อย่างไร

มันจะเป็นการดีถ้ามีโซลูชันที่นำมาใช้ในคิวบ์เพื่อให้เครื่องมือไคลเอนต์ BI ใด ๆ ที่เชื่อมต่อกับคิวบ์สามารถกำหนดช่วง แต่ฉันก็ไม่รังเกียจหากมีวิธีที่ดีในการใช้ Excel เท่านั้น

คำตอบ:


12

วิธีการทำเช่นนี้กับ T-SQL:

ตามที่ร้องขอนี่เป็นทางเลือกหนึ่งสำหรับคำตอบก่อนหน้าของฉันซึ่งแสดงวิธีทำต่อผู้ใช้ด้วย Excel คำตอบนี้แสดงวิธีการทำสิ่งเดียวกันที่ใช้ร่วมกัน / ส่วนกลางโดยใช้ T-SQL แทน ฉันไม่ทราบวิธีการทำ Cubes, MDX หรือเนื้อหา SSAS สำหรับสิ่งนี้ดังนั้นบางทีเบอนัวต์หรือคนที่รู้ว่าสามารถโพสต์สิ่งที่เทียบเท่า ...

1. เพิ่ม SalaryRanges SQL Table และมุมมอง

สร้างตารางใหม่ที่ชื่อว่า "SalaryRangeData" ด้วยคำสั่งต่อไปนี้:

Create Table SalaryRangeData(MinVal INT Primary Key)

เพิ่มคอลัมน์จากการคำนวณโดยใส่ไว้ใน View ด้วยคำสั่งนี้:

CREATE VIEW SalaryRanges As
WITH
  cteSequence As
(
    Select  MinVal,
            ROW_NUMBER() OVER(Order By MinVal ASC) As Sequence
    From    SalaryRangeData
)
SELECT 
    D.Sequence,
    D.MinVal,
    COALESCE(N.MinVal - 1, 2147483645)  As MaxVal,
    CAST(D.MinVal As Varchar(32))
    + COALESCE(' - ' + CAST(N.MinVal - 1 As Varchar(32)), '+')
                        As RangeVals
FROM        cteSequence As D 
LEFT JOIN   cteSequence As N ON N.Sequence = D.Sequence + 1

คลิกขวาที่ตารางใน SSMS และเลือก "แก้ไข 200 แถวสูงสุด" จากนั้นป้อนค่าต่อไปนี้ลงในเซลล์ MinVal: 0, 501, 1001 และ 2001 (ลำดับไม่สำคัญสำหรับ SQL Server มันจะสร้างให้เรา) ปิดตัวแก้ไขตารางแถวและทำSELECT * FROM SalaryRangesเพื่อดูข้อมูลแถวและช่วงทั้งหมด

2. เพิ่มตารางอายุ SQL และมุมมอง

ทำตามขั้นตอนเดียวกับใน # 1 ข้างต้นยกเว้นแทนที่ "เงินเดือน" ทั้งหมดด้วย "อายุ" สิ่งนี้จะทำให้ตาราง "AgeRangeData" และมุมมอง "AgeRanges"

ป้อนค่าต่อไปนี้ลงในคอลัมน์ AgeRangeData [MinVal]: 0, 15, 20, 30 และ 40

3. เพิ่มช่วงไปยังข้อมูล

แทนที่คำสั่ง SELECT ของคุณด้วยนิพจน์ CASE เพื่อดึงข้อมูลและช่วงด้วยคำสั่งต่อไปนี้:

SELECT [CustId]
      ,[CustName]
      ,[Age]
      ,[Salary]
      ,[SalaryRange] = (
            Select RangeVals From SalaryRanges
            Where [Salary] Between MinVal And MaxVal)
      ,[AgeRange] = (
            Select RangeVals From AgeRanges
            Where [Age] Between MinVal And MaxVal)
  FROM [Customers]

4. ทุกอย่างอื่นเหมือนตอนนี้

จากนี้ไปเพียงทำทุกอย่างเหมือนที่คุณเป็นอยู่ในปัจจุบัน ช่วงต่างๆควรปรากฏใน PivotTable ของคุณเหมือนที่ทำอยู่ในปัจจุบัน

5. ทดสอบความมหัศจรรย์

ไปที่ตัวแก้ไขแถว SalaryRangeData ใน SSMS อีกครั้งและลบแถวที่มีอยู่แล้วใส่ค่าต่อไปนี้: 0, 101, 201, 301, ... 2001 (อีกครั้งใบสั่งไม่สำคัญสำหรับโซลูชัน T-SQL) . กลับไปที่ PivotTable ของคุณและรีเฟรชข้อมูล และเช่นเดียวกับโซลูชัน Excel ช่วง PivotTable ควรเปลี่ยนโดยอัตโนมัติ


ส่วนที่เพิ่มเข้าไป

เพิ่มลงในคิวบ์ได้อย่างไร:

1. สร้างมุมมอง

CREATE VIEW CustomerView As
SELECT [CustId]
      ,[CustName]
      ,[Age]
      ,[Salary]
      ,[SalaryRange] = (
            Select RangeVals From SalaryRanges
            Where [Salary] Between MinVal And MaxVal)
      ,[AgeRange] = (
            Select RangeVals From AgeRanges
            Where [Age] Between MinVal And MaxVal)
  FROM [Customers]

1. สร้าง aa BI Project ใน Visual studio และเพิ่ม CustomerView

เชื่อมต่อกับฐานข้อมูลและเพิ่มCustomerViewมุมมองในData Source Viewsตารางเป็นข้อเท็จจริง

มุมมองแหล่งข้อมูล

2. สร้างคิวบ์และกำหนดการวัดและมิติ

เราต้องการลูกค้ารหัสลูกค้าเพื่อวัดจำนวนลูกค้าและจะมีตารางข้อเท็จจริงเหมือนกับมิติ

มาตรการ

ขนาด

3. เพิ่มแอททริบิวให้กับส่วนข้อมูล

เพิ่มช่วงเป็นคุณสมบัติให้กับมิติข้อมูล

4. เชื่อมต่อ Cube จาก Excel

เพิ่มแหล่ง SSAS ให้กับ Excel

เลือก Cube

5. ดูข้อมูลของคิวบ์ใน Excel

ดู Cube ใน Excel

6. สำหรับการเปลี่ยนแปลงใด ๆ ในช่วงเพียงปรับขนาด & คิวบ์ใหม่

ถ้าคุณต้องการที่จะเปลี่ยนช่วงการเปลี่ยนแปลงข้อมูลในSalaryRangeDataและAgeRangeDataแล้วก็ประมวลผลขนาดและก้อน


8

ทำอย่างไรกับ EXCEL

นี่คือวิธีที่ฉันจะทำใน Excel ...

1. เพิ่มตารางเงินเดือนของ Excel

แทรกแผ่นงานใหม่เรียกว่า "ช่วงเงินเดือน" ในแถวที่หนึ่งให้เพิ่มส่วนหัวของข้อความ "Min", "Max" และ "Range" ตามลำดับนั้น (ควรเป็นเซลล์ A1, A2, A3 ตามลำดับ)

ในเซลล์ B2 เพิ่มสูตรต่อไปนี้:

=IF(A2="","",IF(A3="","+",A3-1))

ในเซลล์ C2 เพิ่มสูตรนี้:

=IF(B2="","",A2 & IF(B2="+",""," - ") & B2)

ป้อนอัตโนมัติสองสูตรนี้ลงในคอลัมน์ B และ C สำหรับจำนวนแถวสูงสุดที่คุณอาจต้องการ (ให้บอกว่า 30)

จากนั้นเลือกช่วงทั้งหมด (A1..C31) ไปที่แท็บแทรกแล้วคลิกปุ่มตารางเพื่อเปลี่ยนช่วงนี้เป็นตาราง Excel (สิ่งเหล่านี้เคยถูกเรียกว่า "รายการ") ในแท็บเครื่องมือออกแบบตารางเปลี่ยนชื่อของตารางนี้เป็น "SalaryRanges"

ตอนนี้ไปที่เซลล์ A2 ในคอลัมน์ Min และป้อน "0", "501" ใน A3, "1001" ในเซลล์ A4 และสุดท้าย "2001" ในเซลล์ A5 โปรดทราบว่าเมื่อคุณทำเช่นนี้คอลัมน์ MAx และ Range จะถูกเติมโดยอัตโนมัติ

2. เพิ่มตารางอายุของ Excel

ตอนนี้สร้างเวิร์กชีทใหม่ที่ชื่อว่า "ช่วงอายุ" และทำตามขั้นตอนเดียวกันกับใน # 1 ด้านบนยกเว้นเรียกตารางนี้ว่า "ช่วงอายุ" และในคอลัมน์ Min เติมเซลล์ A2 ถึง A6 ด้วย 0, 15, 20, 30 และ 40 ในการสั่งซื้อ อีกครั้งค่า Max และ Range ควรเติมโดยอัตโนมัติเมื่อคุณไป

3. รับข้อมูล

รับข้อมูลจากฐานข้อมูลลงในสมุดงาน Excel ของคุณเช่นเดียวกับที่คุณเคยทำมาก่อน (อย่าทำ PivotTable เราทำเช่นนี้ด้านล่าง) ยกเว้นคุณควรลบคอลัมน์ฟังก์ชันกรณี AgeRange และ SalaryRange

4. เพิ่มคอลัมน์เงินเดือนและช่วงอายุลงในข้อมูลของคุณ

ในแผ่นงานที่ข้อมูลของคุณอยู่ให้เพิ่มคอลัมน์ "SalaryRange" และ "AgeRange" ในคอลัมน์ SalaryRange ป้อนสูตรต่อไปนี้ใหม่โดยอัตโนมัติ (ถือว่า "D" เป็นคอลัมน์เงินเดือน):

=LOOKUP(D2,SalaryRanges)

และป้อนอัตโนมัติสูตรนี้ในคอลัมน์ AgeRange (สมมติว่า "C" เป็นคอลัมน์อายุ):

=LOOKUP(C2,AgeRanges)

5. ทำให้ PivotTable ของคุณ

ทำสิ่งนี้เหมือนที่คุณเคยทำมาก่อน โปรดทราบว่าค่า / ป้ายกำกับช่วงอายุและเงินเดือนตรงกับช่วงที่คุณเลือก

6. ทดสอบความมหัศจรรย์

ตอนนี้ส่วนที่สนุก ไปที่แผ่นงาน SalaryRanges และป้อนคอลัมน์ Min อีกครั้งโดยเริ่มต้นที่ 0 จากนั้น 101, 201, 301, ... 2001 กลับไปที่ PivotTable แล้วกลับมาที่คุณ Shazaam!


ฉันควรพูดถึงว่าแน่นอนคุณสามารถบรรลุผลเดียวกันโดยการใส่ Tables ใน SQL และเปลี่ยนคำสั่ง SELECT ของคุณเพื่อทำ LOOKUP (.. ) s เป็นคิวรี่ย่อย (ยุ่งเล็กน้อยเนื่องจากการจับคู่ช่วง แต่แน่นอน - สามารถ). เหตุผลที่ฉันทำแบบนี้ (ใน Excel) คือ

  1. การเปลี่ยนช่วงเป็นเรื่องง่ายสำหรับคนส่วนใหญ่ แม้สำหรับนักพัฒนา DBA และ SQL (เช่นเรา) วิธีนี้ง่ายกว่านิดหน่อยเพราะใกล้กับ UI / ผลลัพธ์
  2. สิ่งนี้ช่วยให้ผู้ใช้ของคุณเปลี่ยนช่วงของตนเองโดยไม่ต้องรบกวนคุณ (บวกใหญ่ในชีวิตของฉัน)
  3. สิ่งนี้ยังช่วยให้ผู้ใช้แต่ละคนสามารถกำหนดช่วงของตัวเอง

อย่างไรก็ตามบางครั้งมันก็ไม่เป็นที่พึงปรารถนาที่จะให้ผู้ใช้กำหนดช่วงของตัวเอง หากเป็นกรณีนี้สำหรับคุณเรายินดีที่จะสาธิตวิธีการจากส่วนกลางใน SQL แทน


+1 และขอบคุณมากวิธีแก้ปัญหาทำงานได้อย่างน่าทึ่งการเชื่อมต่อตารางกับข้อมูลที่มีช่วงทั้งหมดใน excel มีวิธีการเชื่อมต่อช่วงที่กำหนดไว้นี้กับตารางสาระสำคัญที่เชื่อมต่อกับ Cube หรือไม่ pivots ของฉันเชื่อมต่อโดยตรงกับ คิวบ์ใน SSAS และจะดีถ้าคุณสามารถแสดง "วิธีการทำจากส่วนกลาง"
AmmarR

ฉันสามารถแสดงให้คุณเห็นวิธีการทำมันจากส่วนกลางด้วยการแสดงออกของ SQL ฉันจะโพสต์ว่าเป็นคำตอบทางเลือก ฉันไม่สามารถแก้ไขปัญหา Cube / SSAS ได้เนื่องจากฉันไม่รู้จักพวกเขา ใช่ฉันควรรู้จักพวกเขาและฉันหวังว่าจะทำ แต่ฉันทำไม่ได้ดังนั้นคนอื่นจะต้องพูดเรื่องนั้น
RBarryYoung

5

ด้วยภาษา MDX คุณสามารถสร้างสมาชิกแบบกำหนดเองที่จะกำหนดช่วง นิพจน์ต่อไปนี้กำหนดสมาชิกจากการคำนวณที่แสดงเงินเดือนทั้งหมดระหว่าง 501 และ 1,000:

MEMBER [Salary].[between_500_and_1000] AS Aggregate(Filter([Salary].Members, [Salary].CurrentMember.MemberValue > 500 AND [Salary].CurrentMember.MemberValue <= 1000))

คุณสามารถทำสิ่งเดียวกันกับมิติอายุ:

MEMBER [Age].[between_0_and_25] AS Aggregate(Filter([Age].Members, [Age].CurrentMember.MemberValue <= 25))

นี้บทความอธิบายถึงวิธีการเพิ่มสมาชิกวิทยานิพนธ์ calculted ใน Excel (ดู ' สร้างคำนวณสมาชิก / มาตรการและชุดใน Excel 2007 OLAP PivotTables ' ส่วน) น่าเสียดายที่ไม่มี UI ใน Excel สำหรับเรื่องนี้ อย่างไรก็ตามคุณสามารถค้นหาไคลเอนต์ BI ที่สนับสนุนภาษาMDXซึ่งอนุญาตให้กำหนดช่วงของคุณในแบบสอบถาม


ขอบคุณ @Benoit กำลังพยายามเพิ่มเขตข้อมูลจากการคำนวณในคิวบ์นั้นด้วยตนเองด้วยแนวคิดเดียวกับที่คุณแนะนำ แต่ฉันยังไม่ทำงานกระบวนการนี้ค่อนข้างยาวและไม่คุ้นเคยกับมันฉันจะลองกับ excel เช่นกัน
AmmarR

ขอบคุณ @RBarryYoung @ MarkStorey-Smith: ฉันสามารถปรับปรุงประสิทธิภาพของสูตรถ้าคุณให้รายการระดับที่อยู่ในSalaryและAgeมิติ
เบอนัวต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.