डायनामिकली एक सीमा को एक आयाम में परिभाषित करें


18

मेरे पास एक मुद्दा है जो मुझे हर बार सामना करना पड़ता है जब मैं एक घन बनाने का फैसला करता हूं, और मुझे अभी तक इसे दूर करने का कोई रास्ता नहीं मिला है।

मुद्दा यह है कि उपयोगकर्ता को आयाम में हार्डकोड की आवश्यकता के बिना चीजों की एक श्रृंखला को स्वचालित रूप से परिभाषित करने की अनुमति कैसे दी जाती है। मैं अपनी समस्या एक उदाहरण में बताऊंगा।

मेरे पास ग्राहक नामक एक तालिका है :

तालिका संरचना

यह तालिका में डेटा है:

डेटा के साथ तालिका

मैं डेटा को धुरी शैली में प्रदर्शित करना चाहता हूं और नीचे की तरह परिभाषित सीमाओं में वेतन और आयु को समूहित करता हूं :

परिभाषित सीमा के साथ डेटा के साथ तालिका

मैंने यह स्क्रिप्ट लिखी है और श्रेणियों को परिभाषित किया है:

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

मेरी सीमाएँ कठिन कूटबद्ध और परिभाषित हैं। जब मैं डेटा को एक्सेल में कॉपी करता हूं और इसे पिवट टेबल में देखता हूं, तो यह नीचे की तरह दिखाई देता है:

पिवट टेबल में डेटा

मेरी समस्या यह है कि मैं ग्राहकों की तालिका को एक तथ्य तालिका में परिवर्तित करके एक क्यूब बनाना चाहता हूं और 2 आयाम तालिकाएं SalaryDim और Ageimim बना सकता हूं

SalaryDim तालिका 2 कॉलम (है SalaryKey, SalaryRange ) और AgeDim तालिका समान है ( ageKey, AgeRange )। मेरे ग्राहक तथ्य तालिका में है:

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

मुझे अभी भी इन आयामों के अंदर अपनी सीमाओं को परिभाषित करना है। हर बार जब मैं एक्सेल पिवेट को अपने क्यूब से जोड़ता हूं, तो मैं केवल इन हार्डकोड को परिभाषित सीमाओं को देख सकता हूं।

मेरा सवाल यह है कि आयु सीमा और वेतनरी जैसे सीमा आयामों को बनाए बिना, सीधे धुरी तालिका से श्रेणियों को कैसे परिभाषित किया जाए । मैं केवल आयाम में परिभाषित सीमाओं के लिए फंस नहीं करना चाहता।

कोई सीमा निर्धारित नहीं

परिभाषित की गई सीमा '0-25', '26 -30 ', '31 - 50' है। मैं इसे '0-20', '21 -31 ', '32 -42' वगैरह में बदलना चाह सकता हूं और हर बार अलग-अलग रेंज के लिए उपयोगकर्ता अनुरोध करते हैं।

जब भी मैं इसे बदलूंगा, मुझे आयाम बदलना होगा। मैं इस प्रक्रिया को कैसे सुधार सकता हूं?

क्यूब में कार्यान्वित समाधान का होना बहुत अच्छा होगा, ताकि जो भी बीआई क्लाइंट टूल क्यूब से जुड़ता है वह पर्वतमाला को परिभाषित कर सके, लेकिन मुझे कोई आपत्ति नहीं है यदि केवल एक्सेल का उपयोग करने का एक अच्छा तरीका है।

जवाबों:


12

टी-एसक्यूएल के साथ कैसे करें:

जैसा कि अनुरोध किया गया है यह मेरे पिछले उत्तर का एक विकल्प है जो यह दिखाता है कि यह एक्सेल के साथ प्रति उपयोगकर्ता कैसे करना है। यह उत्तर दिखाता है कि T-SQL का उपयोग करके समान रूप से साझा / केन्द्रित समान चीज़ कैसे करें। मुझे नहीं पता कि इसके लिए क्यूब्स, एमडीएक्स या एसएसएएस सामान कैसे करना है, इसलिए शायद बेनोइट या कोई ऐसा व्यक्ति जो जानता है कि इसके समकक्ष पोस्ट कर सकता है ...

1. SalaryRanges SQL तालिका और दृश्य जोड़ें

निम्नलिखित कमांड के साथ "SalaryRangeData" नामक एक नई तालिका बनाएँ:

Create Table SalaryRangeData(MinVal INT Primary Key)

इसे इस आदेश के साथ किसी दृश्य में लपेटकर परिकलित स्तंभ जोड़ें:

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 पंक्तियों को संपादित करें" चुनें। फिर मिनल कोशिकाओं में निम्न मान दर्ज करें: 0, 501, 1001, और 2001 (SQL सर्वर के लिए कोई फर्क नहीं पड़ता, यह हमारे लिए इसे बनाएगा)। तालिका-पंक्ति संपादक को बंद करें और SELECT * FROM SalaryRangesसभी पंक्तियों और श्रेणी जानकारी को देखने के लिए एक करें।

2. AgeRanges SQL तालिका और दृश्य जोड़ें

उपरोक्त "# 1" के साथ "सैलेरी" की सभी घटनाओं को छोड़कर, ठीक # 1 के समान चरण करें। इससे टेबल को "एजरेंजडाटा" और व्यू "एजरेंज" बनाना चाहिए।

AgeRangeData [MinVal] कॉलम: 0, 15, 20, 30 और 40 में निम्नलिखित मान दर्ज करें।

3. डेटा में रंग जोड़ें

निम्नलिखित के साथ डेटा और श्रेणियों को पुनः प्राप्त करने के लिए अपने सेलेक्ट स्टेटमेंट को 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 में दिखाना चाहिए जैसा कि वे वर्तमान में करते हैं।

जादू का परीक्षण करें

SSMS में SalaryRangeData टेबल-पंक्ति संपादक पर फिर से जाएं और मौजूदा पंक्तियों को हटा दें और फिर निम्न मान डालें: 0, 101, 201, 301, ... 2001 (फिर, आदेश टी-एसक्यूएल समाधान के लिए कोई फर्क नहीं पड़ता) । अपने PivotTable पर वापस जाएं और डेटा को ताज़ा करें। और एक्सेल समाधान की तरह, 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]

दृश्य स्टूडियो में एक बीआई परियोजना बनाएँ और जोड़ें CustomerView

डेटाबेस से कनेक्ट करें, और फैक्ट टेबल होने के लिए CustomerViewव्यू जोड़ेंData Source Views

डेटा स्रोत दृश्य

2. एक घन बनाएँ और परिभाषित करें और आयाम परिभाषित करें

हमें केवल ग्राहक की जरूरत है, ग्राहक की गिनती के लिए एक उपाय के रूप में और एक आयाम के रूप में एक ही तथ्य तालिका होगी

उपाय

आयाम

3. आयाम में गुण जोड़ें

आयाम में विशेषताएँ के रूप में श्रेणियां जोड़ें

4. एक्सेल से क्यूब से कनेक्ट करें

Excel में SSAS स्रोत जोड़ें

घन का चयन करें

5. एक्सेल में क्यूब का डेटा देखें

एक्सेल में क्यूब देखें

6. सीमाओं में किसी भी बदलाव के लिए बस आयाम और घन को पुन: प्रस्तुत करें

यदि आप, सीमाओं को बदलने में डेटा को बदलने की जरूरत SalaryRangeDataहै और AgeRangeDataऔर फिर बस आयाम और घन पुनर्संसाधन


8

एक्सेल के साथ कैसे करें

यहां बताया गया है कि मैं इसे एक्सेल में कैसे करूंगा ...

1. SalaryRanges एक्सेल टेबल जोड़ें

एक नई वर्कशीट डालें, इसे "सैलरी रेंज" कहें। पंक्ति एक में उस क्रम में "हेड", "मैक्स" और "रेंज" टेक्स्ट हेडर जोड़ें (क्रमशः सेल A1, A2, A3 होना चाहिए)।

सेल B2 में निम्न सूत्र जोड़ें:

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

सेल C2 में इस सूत्र को जोड़ें:

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

अधिकतम दो पंक्तियों के लिए इन दो फॉर्मूले को B और C कॉलम से नीचे करें, जिनकी आपको कभी आवश्यकता हो सकती है (30 कहते हैं)।

अगला, संपूर्ण श्रेणी (A1..C31) का चयन करें। सम्मिलित करें टैब पर गया और इस रेंज को एक्सेल टेबल में बदलने के लिए टेबल बटन पर क्लिक करें (इन्हें "सूची" कहा जाता था)। तालिका उपकरण डिज़ाइन टैब में, इस तालिका का नाम बदलकर "SalaryRanges" करें।

अब, मिन कॉलम में सेल ए 2 पर जाएं और सेल ए 5 में "0", "501", ए 3 में "1001" और अंत में सेल ए 5 में "2001" दर्ज करें। ध्यान दें कि जब आप ऐसा करते हैं तो MAx और रेंज कॉलम स्वचालित रूप से भरे जाते हैं।

2. एजरेंग एक्सेल टेबल जोड़ें

अब एक और नया वर्कशीट बनाएं जिसका नाम है "एज रेंज्स", और ठीक इसी तरह से # 1 ऊपर दिए गए चरणों को करें, सिवाय इस टेबल को "एजरंग्स" के और मिन कॉलम में सेल A2 को A6 से 0, 15, 20, 30 और 30 तक भरें। 40, क्रम में। फिर से, अधिकतम और रेंज मान को स्वचालित रूप से भरना चाहिए जैसे कि आप जाते हैं।

3. डेटा प्राप्त करें

डेटाबेस से डेटा अपने एक्सेल वर्कबुक में प्राप्त करें जैसे आपने पहले किया था (अभी तक PivotTable नहीं बनाते हैं, हम नीचे ऐसा करते हैं), सिवाय इसके कि आप AgeRange और SalaryRange केस फ़ंक्शन कॉलम को हटा दें।

4. अपने डेटा में वेतन और आयु सीमा कॉलम जोड़ें

उस शीट में जहां आपका डेटा है, एक "सैलरीरेंज" और "एजरेंज" कॉलम जोड़ें। SalaryRange स्तंभ में, निम्न सूत्र को स्वतःभरण करता है (मानता है कि "D" वेतन स्तंभ है):

=LOOKUP(D2,SalaryRanges)

और इस सूत्र को AgeRange कॉलम पर यह मान लें कि ("C" आयु स्तंभ है)

=LOOKUP(C2,AgeRanges)

5. अपना PivotTable बनाएं

यह वैसा ही करें जैसा आपने पहले किया था। ध्यान दें कि आयु और वेतन श्रेणी मान / लेबल आपके द्वारा चुनी गई श्रेणियों से मेल खाते हैं।

6. जादू का परीक्षण करें

अब मजा हिस्सा है। SalaryRanges वर्कशीट पर जाएं और 0, फिर 101, 201, 301, ... 2001 से शुरू होने वाले मिन कॉलम को फिर से दर्ज करें। आप पर वापस जाएं PivotTable और बस इसे रीफ्रेश करें। Shazaam!


मुझे यह उल्लेख करना चाहिए कि निश्चित रूप से आप SQL में Tables डालकर और LOOKUP करने के लिए अपने SELECT स्टेटमेंट को बदलकर भी इसी तरह का प्रभाव प्राप्त कर सकते हैं (उप-श्रेणी के कारण थोड़ा गड़बड़ है), लेकिन निश्चित रूप से ऐसा करें- योग्य)। कारण कि मैंने इसे इस तरह से (एक्सेल में) किया है

  1. अधिकांश लोगों के लिए पर्वतमाला बदलना थोड़ा आसान है। यहां तक ​​कि डीबीए और एसक्यूएल डेवलपर्स (हमारे जैसे) के लिए, यह तरीका थोड़ा आसान है, क्योंकि यह यूआई / परिणामों के करीब है।
  2. यह आपके उपयोगकर्ताओं को आपको परेशान किए बिना अपनी सीमाएं बदलने की अनुमति देता है। (मेरे जीवन में एक बड़ा प्लस)
  3. यह प्रत्येक उपयोगकर्ता को अपनी सीमाओं को परिभाषित करने की भी अनुमति देता है।

हालाँकि, कभी-कभी यह वास्तव में अवांछनीय है कि उपयोगकर्ता अपनी सीमाओं को परिभाषित कर रहे हैं। अगर आपके लिए ऐसा है, तो मुझे यह प्रदर्शित करने में खुशी होगी कि यह कैसे करना है, इसके बजाय SQL में।


+1 और धन्यवाद बहुत कुछ अद्भुत काम करता है, तालिका को डेटा के साथ एक्सेल में सभी श्रेणियों के साथ जोड़ता है, क्या इस परिभाषित सीमाओं को धुरी तालिका से जोड़ने का एक तरीका है जो क्यूब से जुड़ा है, मेरे पिवोट्स सीधे जुड़े हुए हैं SSAS में घन, और यह भी बहुत अच्छा होगा यदि आप "इसे केंद्र में कैसे करें" दिखा सकते हैं।
सितंबर को AmmarR

मैं आपको यह दिखा सकता हूं कि इसे SQL अभिव्यक्तियों के साथ कैसे करना है, मैं इसे वैकल्पिक उत्तर के रूप में पोस्ट करूंगा। मैं क्यूब / एसएसएएस मुद्दों को संबोधित नहीं कर सकता क्योंकि दुर्भाग्य से मैं उन्हें नहीं जानता। हां, मुझे उन्हें जानना चाहिए और मेरी इच्छा है कि मैंने किया, लेकिन मैं नहीं करता, इसलिए किसी और को संबोधित करना होगा।
RBarryYoung

5

MDX भाषा के साथ आप कस्टम सदस्य बना सकते हैं जो सीमाओं को परिभाषित करेगा। निम्नलिखित अभिव्यक्ति ने एक परिकलित सदस्य को परिभाषित किया जो 501 और 1000 के बीच सभी वेतन का प्रतिनिधित्व करता है:

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))

यह आलेख बताता है कि एक्सेल में शोधित कैलक्स्ड सदस्यों को कैसे जोड़ा जाए (देखें ' एक्सेल 2007 OLAP PivotTables ' अनुभाग में परिकलित सदस्य / उपाय और सेट बनाना )। अफसोस की बात है कि इसके लिए एक्सेल में कोई यूआई नहीं है। फिर भी आप BI क्लाइंट ढूंढ सकते हैं जो MDX भाषा का समर्थन करते हैं, जो आपके रंग को प्रश्नों में परिभाषित करने की अनुमति देता है।


धन्यवाद @Benoit, मैं क्यूब में परिकलित फ़ील्ड्स को जोड़ने की कोशिश कर रहा हूँ, यह उसी अवधारणा के साथ है जो आप सुझा रहे हैं, लेकिन मैं अभी तक काम नहीं कर रहा हूँ, प्रक्रिया थोड़ी लंबी है और मैं इससे परिचित नहीं हूँ, मैं इसे एक्सेल के साथ आज़माऊंगा साथ ही,
AmmarR

धन्यवाद @RBarryYoung @ MarkStorey- स्मिथ: मैं सूत्र दक्षता में सुधार कर सकता हूं, यदि आप मुझे उन स्तरों की सूची देते हैं जो आयाम Salaryऔर Ageआयाम में हैं।
बेनोइट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.