গতিশীলভাবে একটি মাত্রায় একটি ব্যাপ্তি নির্ধারণ করুন


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 টেবিল 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

এটি টি-এসকিউএল দিয়ে কীভাবে করবেন:

অনুরোধ করা হিসাবে এটি আমার পূর্ববর্তী উত্তরের একটি বিকল্প যা এটি এক্সেল দিয়ে প্রতি ব্যবহারকারীকে কীভাবে করতে হয় তা দেখিয়েছে। এই উত্তরটি দেখায় যে কীভাবে একই পরিবর্তে টি-এসকিউএল ব্যবহার করে ভাগ করা / কেন্দ্রিকভাবে করা যায়। এর জন্য কিউবস, এমডিএক্স বা এসএসএএস স্টাফ কীভাবে করব তা আমি জানি না, তাই বেনোইট বা যারা জানেন যে এটি তার সমতুল্য পোস্ট করতে পারে ...

1. স্যালারিরেঞ্জস এসকিউএল টেবিল এবং দেখুন যুক্ত করুন

নিম্নলিখিত কমান্ডের সাহায্যে "স্যালারিরেঞ্জডেটা" নামে একটি নতুন সারণী তৈরি করুন:

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

এসএসএমএসের টেবিলে ডান ক্লিক করুন এবং "শীর্ষস্থানীয় 200 সারিগুলি সম্পাদনা করুন" নির্বাচন করুন। তারপরে MinVal কোষগুলিতে নিম্নলিখিত মানগুলি প্রবেশ করান: 0, 501, 1001 এবং 2001 (অর্ডারটি এসকিউএল সার্ভারের জন্য কোনও ব্যাপার নয়, এটি আমাদের জন্য এটি তৈরি করবে)। সারণী-সারি সম্পাদকটি বন্ধ করুন এবং SELECT * FROM SalaryRangesসারি এবং পরিসীমা সম্পর্কিত সমস্ত তথ্য দেখতে একটি করুন।

2. এজেন্সি এসকিউএল টেবিল এবং দেখুন যুক্ত করুন

"বেতন" এর সমস্ত উপস্থিতি "বয়স" দিয়ে প্রতিস্থাপন ব্যতীত উপরের # 1 এর মতো ঠিক একই পদক্ষেপগুলি করুন। এটি "এজরেঞ্জডেটা" টেবিলটি এবং "এজরেঞ্জস" দর্শনটি তৈরি করা উচিত।

এজরেঞ্জডেটা [মিনিভ্যাল] কলামে নিম্নলিখিত মানগুলি লিখুন: 0, 15, 20, 30, এবং 40।

৩. ডেটাতে ব্যাপ্তি যুক্ত করুন

নিম্নলিখিতটি দিয়ে ডেটা এবং রেঞ্জগুলি পুনরুদ্ধারের জন্য আপনার নির্বাচনী বিবৃতিটি 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]

৪. অন্য সব কিছুই, এখন যেমন একই রকম

এখান থেকে, আপনি বর্তমানে যেমন করেন ঠিক তেমন কিছু করুন। ব্যাপ্তিগুলি বর্তমানে আপনার পিভটটেবলে প্রদর্শিত হবে।

5. ম্যাজিক পরীক্ষা করুন

আবার এসএসএমএসে স্যালারিরেঞ্জডেটা টেবিল-সারি সম্পাদকটিতে যান এবং বিদ্যমান সারিগুলি মুছুন এবং তারপরে নিম্নলিখিত মানগুলি সন্নিবেশ করুন: 0, 101, 201, 301, ... 2001 (আবারও, টি-এসকিউএল সমাধানের জন্য অর্ডার কোনও ব্যাপার নয়) । আপনার পিভটটেবলে ফিরে যান এবং ডেটা রিফ্রেশ করুন। এবং ঠিক এক্সেল সমাধানের মতো, পিভটটেবল রেঞ্জগুলি স্বয়ংক্রিয়ভাবে পরিবর্তন করা উচিত।


সংযোজন

এটি কিউবে কীভাবে যুক্ত করুন:

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. ভিজ্যুয়াল স্টুডিওতে এএ বিআই প্রকল্প তৈরি করুন এবং যুক্ত করুন CustomerView

ডেটাবেস সাথে সংযুক্ত করুন, এবং ফ্যাক্ট টেবিল হতে CustomerViewভিউ যুক্ত করুনData Source Views

ডেটা উত্স দর্শন

2. একটি কিউব তৈরি করুন এবং পরিমাপ ও মাত্রা সংজ্ঞায়িত করুন

আমাদের কেবল গ্রাহকআইডি প্রয়োজন, গ্রাহক গণনার পরিমাপ হিসাবে এবং মাত্রার মতো একই ফ্যাক্ট টেবিল থাকবে

ব্যবস্থা

মাত্রা

৩. মাত্রাটিতে বৈশিষ্ট্য যুক্ত করুন

মাত্রাটির বৈশিষ্ট্য হিসাবে ব্যাপ্তি যুক্ত করুন

4. এক্সেল থেকে কিউব সংযোগ করুন

এক্সেলে এসএসএএস উত্স যুক্ত করুন

কিউব নির্বাচন করুন

৫. এক্সেলের কিউবের ডেটা দেখুন

এক্সেলের কিউবটি দেখুন

The. ব্যাপ্তিগুলির যে কোনও পরিবর্তনের জন্য মাত্রা এবং কিউবটিকে পুনরায় প্রসেস করুন

আপনি যদি রেঞ্জের পরিবর্তন ডাটা পরিবর্তন করতে হবে SalaryRangeDataএবং AgeRangeDataএবং তারপর মাত্র মাত্রা এবং ঘনক্ষেত্র পুনরায় প্রক্রিয়া


8

এক্সেল দিয়ে এটি কীভাবে করবেন

আমি এখানে এটি কীভাবে করব এক্সেলে ...

1. স্যালারিরেঞ্জস এক্সেল সারণী যুক্ত করুন

একটি নতুন কার্যপত্রক sertোকান, এটিকে "বেতন সীমা" বলুন। সারিতে একটি পাঠ্য শিরোনাম "ন্যূনতম", "সর্বাধিক" এবং "ক্রম" সেই ক্রমে যুক্ত করুন (যথাক্রমে ঘর A1, A2, A3 হওয়া উচিত)।

বি 2 তে নীচের সূত্রটি যুক্ত করুন:

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

C2 কক্ষে এই সূত্রটি যুক্ত করুন:

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

আপনার প্রয়োজন হতে পারে সর্বাধিক সংখ্যক সারিগুলির জন্য বি এবং সি কলামগুলিতে এই দুটি সূত্রটি স্বতঃপূর্ণ করুন (আসুন 30 বলে দিন)।

এরপরে, পুরো ব্যাপ্তিটি নির্বাচন করুন (A1..C31)। সারণি ট্যাবে গিয়ে এই সীমাটি একটি এক্সেল সারণিতে পরিবর্তন করতে টেবিল বোতামটি ক্লিক করুন (এগুলিকে "তালিকাগুলি" বলা হত)। সারণী সরঞ্জাম ডিজাইন ট্যাবে, এই সারণির নামটি "স্যালারিরেঞ্জস" এ পরিবর্তন করুন।

এখন, ন্যূনতম কলামের কক্ষ A2 এ যান এবং "0", A3-তে "501", ঘর A4 এ "1001" এবং অবশেষে ঘর A5 এ "2001" লিখুন। মনে রাখবেন যে আপনি এটি করার সাথে সাথে ম্যাক্স এবং ব্যাপ্তি কলামগুলি স্বয়ংক্রিয়ভাবে পূরণ হয়ে গেছে।

2. এজরেঞ্জস এক্সেল সারণী যুক্ত করুন

এখন "বয়সসীমা" নামে নতুন একটি নতুন কার্যপত্রক তৈরি করুন এবং উপরের # 1 এর মতো ঠিক একই পদক্ষেপগুলি করুন, এই টেবিলটিকে "এজরেঞ্জস" কল করুন এবং ন্যূনতম কলামে 0, 15, 20, 30, এবং A6 তে A2 তে ঘরগুলি পূরণ করুন এবং 40, ক্রম। আবার, সর্বাধিক এবং ব্যাপ্তির মানগুলি আপনি যাওয়ার সাথে সাথে স্বয়ংক্রিয়ভাবে পূরণ করতে হবে।

৩. ডেটা পান

আপনি যেমন আগে করেছেন তেমনই আপনার এক্সেল ওয়ার্কবুকে ডাটাবেস থেকে ডেটা পান (পিভটটেবিলটি এখনও তৈরি করবেন না, আমরা নীচে তা করি) বাদে আপনার এজেনজ এবং স্যালারিরেঞ্জ কেস ফাংশন কলামগুলি অপসারণ করা উচিত except

৪. আপনার ডেটাতে বেতন এবং বয়সসীমা কলামগুলি যুক্ত করুন

আপনার ডেটা যে শীটটিতে রয়েছে সেখানে একটি "স্যালারিরেঞ্জ" এবং "এজরেঞ্জ" কলাম যুক্ত করুন। স্যালারিরেঞ্জ কলামে, নিম্নলিখিত সূত্রটি স্বতঃপূর্ণ করুন (ধরে নিন যে "ডি" বেতনের কলাম):

=LOOKUP(D2,SalaryRanges)

এবং এজরেঞ্জ কলামে এই সূত্রটি স্বতঃপূর্ণ করুন (ধরে নেওয়া যে "সি" বয়সের কলাম):

=LOOKUP(C2,AgeRanges)

5. আপনার পিভটটেবল করুন

আপনি যেমন আগে করেছিলেন ঠিক তেমন করুন। মনে রাখবেন যে বয়স এবং বেতনের পরিসর মান / লেবেলগুলি আপনি চয়ন করেন এমন রেঞ্জের সাথে মেলে।

6. যাদু পরীক্ষা করুন

এখন মজার অংশ। স্যালারিরেঞ্জস ওয়ার্কশিটে যান এবং 0 থেকে শুরু করে ন্যূনতম কলামটি পুনরায় প্রবেশ করুন, তারপরে 101, 201, 301, ... 2001. আপনি পিভটটেবলে ফিরে যান এবং কেবল তা রিফ্রেশ করুন। Shazaam!


আমার অবশ্যই উল্লেখ করা উচিত যে আপনি এসকিউএল-এ টেবিলগুলি রেখে এবং লকআপ (..) এর সাবকিউরির (পরিসীমার সাথে সামঞ্জস্যের কারণে কিছুটা অগোছালো) করার জন্য আপনার নির্বাচনী বিবৃতি পরিবর্তন করেও একই প্রভাব অর্জন করতে পারেন definitely সক্ষম)। আমি এটি (এক্সেলের মধ্যে) এভাবে করার কারণটি

  1. সীমা পরিবর্তন করা বেশিরভাগ মানুষের পক্ষে কিছুটা সহজ। এমনকি ডিবিএ এবং এসকিউএল বিকাশকারীদের জন্য (আমাদের মতো), ইউআই / ফলাফলের কাছাকাছি হওয়ার কারণে এই পথটি খানিকটা সহজ।
  2. এটি আপনাকে বিরক্ত না করেই আপনার ব্যবহারকারীদের নিজস্ব রেঞ্জ পরিবর্তন করতে দেয়। (আমার জীবনে একটি বড় প্লাস)
  3. এটি প্রতিটি ব্যবহারকারীর নিজস্ব ব্যাপ্তি নির্ধারণ করতেও সহায়তা করে।

যাইহোক, কখনও কখনও এটি ব্যবহারকারীদের নিজস্ব রেঞ্জগুলি সংজ্ঞায়িত করা আসলেই অনাকাঙ্ক্ষিত । যদি এটি আপনার ক্ষেত্রে হয় তবে আমি পরিবর্তে এসকিউএলে এটি কীভাবে কেন্দ্রীয়ভাবে করব তা প্রদর্শন করে খুশি হব।


+1 এবং ধন্যবাদ অনেকটা সমাধান আশ্চর্যজনকভাবে কাজ করে, সমস্ত এক্সেলের মধ্যে ব্যাপ্তিগুলির সাথে ডেটাগুলির সাথে টেবিলটি সংযুক্ত করে, কিবিবের সাথে সংযুক্ত পিভট টেবিলের সাথে এই সংজ্ঞায়িত রেঞ্জগুলি সংযুক্ত করার কোনও উপায় আছে, আমার পিভটগুলি সরাসরি এর সাথে সংযুক্ত রয়েছে এসএসএএস-এ কিউব, এবং এটি "সেন্ট্রালভাবে কীভাবে এটি করা যায়" প্রদর্শন করতে পারলে দুর্দান্ত হবে।
আম্মারআর

এসকিউএল এক্সপ্রেশন দিয়ে কেন এটি কেন্দ্রীয়ভাবে করা যায় তা আমি আপনাকে দেখাতে পারি, আমি বিকল্প বিকল্প হিসাবে পোস্ট করব। আমি কিউব / এসএসএএস সমস্যাগুলি সমাধান করতে পারি না কারণ দুর্ভাগ্যবশত আমি সেগুলি জানি না। হ্যাঁ, আমার সেগুলি জানা উচিত এবং আমি ইচ্ছা করি আমি এটি করি তবে আমি তা করি না, তাই অন্য কারও কাছে এটির সমাধান করতে হবে।
আরবেরি ইয়ং

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 ওএলএপি পিওটটিবেলস বিভাগে ' গণনা করা সদস্য / ব্যবস্থা এবং সেটগুলি দেখুন )। দুঃখজনকভাবে এর জন্য এক্সেলের কোনও ইউআই নেই। তবুও আপনি বিআই ক্লায়েন্টগুলি খুঁজে পেতে পারেন যা এমডিএক্স ভাষা সমর্থন করে , যা অনুসন্ধানগুলিতে আপনার রেঞ্জগুলি সংজ্ঞায়িত করতে দেয়।


ধন্যবাদ @ বেনোইট, আপনি যে ধারণাটি প্রস্তাব করছেন ঠিক তেমনই কিউবে এটি গণিত ক্ষেত্রগুলি যুক্ত করার চেষ্টা করছি তবে আমি এখনও কাজ করে দেখছি না, প্রক্রিয়াটি বেশ দীর্ঘতর এবং এর সাথে আমি পরিচিত নই আমি এক্সেল দিয়ে চেষ্টা করব পাশাপাশি,
আম্মারআর

ধন্যবাদ @ আরবেরি ইউং @ মার্কস্টোরি-স্মিথ: আপনি যদি আমাকে মাত্রা Salaryএবং Ageমাত্রার স্তরের তালিকা দেন তবে আমি সূত্রের দক্ষতা উন্নত করতে পারি ।
বেনোইট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.