Динамічно визначте діапазон у розмірі


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

Мої діапазони жорстко закодовані та визначені. Коли я копіюю дані в Excel і переглядаю їх у зведеній таблиці, це відображається нижче:

Дані у зведеній таблиці

Моя проблема полягає в тому, що я хочу створити куб, перетворивши таблицю « Клієнти» в таблицю фактів і створити 2 таблиці розмірів SalaryDim & AgeDim .

Таблиця SalaryDim має 2 стовпці ( SalaryKey, SalaryRange ), а таблиця AgeDim схожа ( ageKey, AgeRange ). Таблиця фактів мого клієнта :

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. Я не знаю, як робити для цього куби, MDX або SSAS, тому, можливо, Бенуа або хтось, хто це знає, може розмістити його еквівалент ...

1. Додайте таблицю SQL та перегляд SalaryRanges

Створіть нову таблицю під назвою "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 рядків". Потім введіть у комірки MinVal наступні значення: 0, 501, 1001 та 2001 (порядок не має значення для SQL Server, він створить його для нас). Закрийте редактор рядків таблиць і зробіть а, SELECT * FROM SalaryRangesщоб побачити всю інформацію про рядки та діапазон.

2. Додайте таблицю та подання SQL AgeRanges

Виконайте такі ж дії, як у №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. Все інше, те саме, що зараз

З цього моменту просто робіть все так, як ви є зараз. Усі діапазони повинні відображатися у вашій зведеній таблиці, як це відбувається в даний час.

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. Створіть BI-проект у візуальній студії та додайте CustomerView

Підключіться до бази даних та додайте CustomerViewПерегляд у Data Source Viewsтаблицю Фактів

Перегляди джерел даних

2. Створіть куб та визначте міру та розмірність

нам потрібен лише customerId, як міра для підрахунку клієнтів, і буде мати таку ж таблицю фактів, що і параметр

Заходи

Розміри

3. Додайте атрибути до виміру

Додайте діапазони як атрибути до параметра

4. Підключіться до Cube від Excel

Додайте джерело SSAS в Excel

Виберіть Куб

5. Перегляньте дані куба в Excel

Перегляд куба в Excel

6. Для будь-яких змін у діапазонах просто переробляйте розмір і куб

якщо вам потрібно змінити діапазони, змініть дані в SalaryRangeDataі, AgeRangeDataа потім просто переробіть розміри та куб


8

ЯК ЗРОБИТИ ЦЕ З ЕКСЕЛОМ

Ось як я це зробив би в Excel ...

1. Додайте таблицю Excel заробітної плати

Вставте новий робочий аркуш, назвіть його "Зарплата". У першому рядку додайте текстові заголовки "Мін", "Макс" та "Діапазон" у такому порядку (мають бути комірки A1, A2, A3 відповідно).

У комірку В2 додайте таку формулу:

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

У комірку С2 додайте цю формулу:

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

Автозаповніть ці дві формули вниз по стовпцям B і C для максимальної кількості рядків, яка вам може знадобитися (скажімо 30).

Далі виберіть весь діапазон (A1..C31). Перейдіть на вкладку "Вставка" і натисніть кнопку "Таблиця", щоб змінити цей діапазон у таблицю Excel (вони називалися "Списки"). На вкладці "Дизайн інструментів таблиці" змініть назву цієї таблиці на "Зарплата".

Тепер перейдіть до комірки A2 у стовпці Min та введіть "0", "501" у A3, "1001" у комірці A4 та нарешті "2001" у комірці A5. Зауважте, що при цьому стовпці MAx та Range автоматично заповнюються.

2. Додати таблицю Excel AgeRanges

Тепер зробіть ще один робочий аркуш під назвою "Вікові діапазони" та виконайте такі самі кроки, як у №1 вище, за винятком називання цієї таблиці "AgeRanges" і в стовпці "Мін" заповніть комірки від A2 до A6 цифрами 0, 15, 20, 30 та 40, по порядку. Знову ж таки, значення Макс та Діапазон повинні автоматично заповнюватися по мірі переходу.

3. Отримати дані

Отримати дані з бази даних у вашій робочій книжці Excel так само, як ви робили раніше (ще не робимо PivotTable, ми робимо це нижче), за винятком випадків, коли ви повинні видаляти стовпці функцій AgeRange та SalaryRange.

4. Додайте до своїх даних стовпці заробітної плати та вікового діапазону

На аркуші, де є ваші дані, додайте стовпчик "Зарплата" та "AgeRange". У стовпці SalaryRange автозаповніть таку формулу (припускається, що "D" - стовпець "Зарплата"):

=LOOKUP(D2,SalaryRanges)

І автоматично заповніть цю формулу в стовпці AgeRange (якщо припустити, що "C" - це стовпець Age):

=LOOKUP(C2,AgeRanges)

5. Зробіть свій зведений таблицю

Робіть це так, як ви робили раніше. Зауважте, що значення / мітки діапазону "Вік" та "Заробітна плата" відповідають вибраним діапазонам.

6. Тест на магію

Тепер весела частина. Перейдіть на робочий аркуш SalaryRanges і повторно введіть стовпець "Мін", починаючи з 0, потім 101, 201, 301, ... 2001. Поверніться до PivotTable і просто оновіть його. Шазаам!


Я мушу зазначити, що, звичайно, ви можете досягти того ж ефекту, помістивши таблиці в SQL і змінивши свій оператор SELECT, щоб зробити LOOKUP (..) s як підзапит (трохи безладний через відповідність діапазону, але, безумовно, робити- вміє). Причина того, що я зробив це так (в Excel), є

  1. Зміна діапазонів для більшості людей трохи легше. Навіть для розробників DBA та SQL (як і ми) цей спосіб дещо простіший лише тому, що він ближче до інтерфейсу / результатів.
  2. Це дозволяє вашим користувачам змінювати власні діапазони, не турбуючи вас. (ВЕЛИКИЙ плюс у моєму житті)
  3. Це також дозволяє кожному користувачеві визначити власні діапазони.

Однак іноді насправді небажано, щоб користувачі визначали свій діапазон. Якщо це для вас, я з радістю продемонструю, як це зробити централізовано, замість цього в SQL.


+1 і спасибі багато рішення, це працює чудово, з'єднуючи таблицю з даними з діапазонами, в повному обсязі, чи є спосіб з'єднати цей визначений діапазон зі зведеною таблицею, підключеною до куба, мої повороти безпосередньо підключені до куба в SSAS, а також було б чудово, якби ви могли показати "як це зробити централізовано".
AmmarR

Я можу показати вам, як це робити центрально за допомогою SQL-виразів, опублікую це як альтернативну відповідь. Я не можу вирішити проблеми Cube / SSAS, тому що, на жаль, я їх не знаю. Так, я повинен їх знати, і я хотів би, щоб це зробив, але цього не роблю, тому комусь іншому доведеться це вирішувати.
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))

У цій статті пояснюється, як додати тези вирахуваних членів у Excel (див. " Створення обчислених членів / заходів та наборів у розділі зведених таблиць OLAP Excel 2007 "). На жаль, в Excel для цього немає інтерфейсу користувача. Тим не менш, ви можете знайти клієнтів BI, які підтримують мову MDX , які дозволяють визначати ваші діапазони в запитах.


дякую @ Бенуа, я намагаюся додати обчислені поля в кубі, я сам, з тією ж концепцією, яку ти пропонуєш, але я, здається, ще не працює, процес трохи тривалий, і я не знайомий з ним, я спробую це з excel також,
AmmarR

Дякую @RBarryYoung @ MarkStorey-Smith: Я можу підвищити ефективність формули, якщо ви дасте мені список рівнів, що знаходяться в Salaryі Ageрозмірності.
Бенуа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.