Динамическое определение диапазона в измерении

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 и просматриваю их в сводной таблице, они выглядят так:

Данные в сводной таблице

Моя проблема заключается в том, что я хочу создать куб путем преобразования таблицы « Клиенты» в таблицу фактов и создания двух таблиц измерений 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.

AmmarR
источник

Ответы:

12

КАК СДЕЛАТЬ ЭТО С T-SQL:

В соответствии с просьбой это альтернатива моему предыдущему ответу, который показал, как это сделать для каждого пользователя в Excel. Этот ответ показывает, как сделать то же самое совместно / централизованно, используя вместо этого T-SQL. Я не знаю, как сделать кубы, MDX или SSAS для этого, так что, возможно, Бенуа или кто-то, кто знает, может опубликовать свой эквивалент ...

1. Добавьте SalaryRanges SQL Table и View

Создайте новую таблицу с именем «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команду a, чтобы просмотреть все строки и информацию о диапазоне.

2. Добавьте AgeRanges SQL Table и View

Выполните те же самые шаги, что и в # 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) , Вернитесь к сводной таблице и обновите данные. И так же, как в решении Excel, диапазоны сводных таблиц должны автоматически изменяться.


прибавление

КАК ДОБАВИТЬ В КУБ:

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 в Visual studio и добавьте CustomerView

Подключитесь к базе данных и добавьте CustomerViewпредставление в Data Source Viewsтаблицу фактов

Представления источника данных

2. Создайте куб и определите меру и размер

нам нужен только customerId, как показатель количества клиентов, и мы будем иметь ту же таблицу фактов, что и измерение

меры

Габаритные размеры

3. Добавьте атрибуты к измерению

Добавить диапазоны в качестве атрибутов измерения

4. Подключитесь к Cube из Excel

Добавить источник SSAS в Excel

Выберите куб

5. Просмотр данных куба в Excel

Посмотреть куб в Excel

6. Для Любых изменений в Диапазонах просто повторно обработайте Измерение & куб

если вам нужно изменить диапазоны, измените данные в SalaryRangeDataи, AgeRangeDataа затем просто повторно обработайте измерения и куб

RBarryYoung
источник
8

КАК СДЕЛАТЬ ЭТО С EXCEL

Вот как бы я сделал это в Excel ...

1. Добавить таблицу SalaryRanges 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. Добавить таблицу AgeRanges Excel

Теперь создайте еще одну новую таблицу с именем «Возрастные диапазоны» и выполните те же шаги, что и в # 1 выше, за исключением того, что вызовите эту таблицу «AgeRanges» и в столбце Min заполните ячейки A2 - A6 с 0, 15, 20, 30 и 40, по порядку. Опять же, значения Max и Range должны автоматически заполняться по мере продвижения.

3. Получить данные

Получите данные из базы данных в свою книгу Excel, как вы делали это раньше (пока не делайте сводную таблицу, мы сделаем это ниже), за исключением того, что вы должны удалить столбцы регистрационных функций AgeRange и SalaryRange.

4. Добавьте столбцы «Зарплата» и «Возрастной диапазон» к вашим данным.

На листе, где находятся ваши данные, добавьте столбцы «SalaryRange» и «AgeRange». В столбце SalaryRange автоматически заполните следующую формулу (предполагается, что «D» - столбец Salary):

=LOOKUP(D2,SalaryRanges)

И автоматически заполните эту формулу в столбце AgeRange (при условии, что «C» - столбец Age):

=LOOKUP(C2,AgeRanges)

5. Сделайте свою сводную таблицу

Делайте это так же, как вы делали раньше. Обратите внимание, что значения / метки диапазона возраста и оклада соответствуют выбранным диапазонам.

6. Испытайте магию

Теперь самое интересное. Перейдите на лист SalaryRanges и снова введите столбец Min, начиная с 0, затем 101, 201, 301, ... 2001. Вернитесь к сводной таблице и просто обновите ее. Shazaam!


Я должен отметить, что, конечно, вы также можете добиться того же эффекта, поместив таблицы в SQL и изменив оператор SELECT, чтобы сделать LOOKUP (..) в качестве подзапроса (немного грязно из-за соответствия диапазона, но определенно состояние). Причина, по которой я это сделал (в Excel)

  1. Изменение диапазона немного проще для большинства людей. Даже для администраторов баз данных и разработчиков SQL (таких как мы) этот способ немного проще, поскольку он ближе к пользовательскому интерфейсу / результатам.
  2. Это позволяет вашим пользователям изменять свои собственные диапазоны, не беспокоя вас. (большой плюс в моей жизни)
  3. Это также позволяет каждому пользователю определять свои собственные диапазоны.

Однако иногда нежелательно, чтобы пользователи определяли свои собственные диапазоны. Если это так, я буду рад продемонстрировать, как это сделать централизованно, вместо этого в SQL.

RBarryYoung
источник
+1 и большое спасибо, решение работает замечательно, соединяя таблицу с данными с диапазонами в Excel, есть ли способ связать эти определенные диапазоны с сводной таблицей, которая связана с Cube, мои сводные точки напрямую связаны с куб в 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 , который позволяет определять ваши диапазоны в запросах.

Benoit
источник
спасибо @Benoit, я пытаюсь добавить вычисляемые поля в сам куб с той же концепцией, которую вы предлагаете, но я, кажется, еще не работал, процесс немного длительный, и я не знаком с ним, я попробую его с Excel а также,
AmmarR
Спасибо @RBarryYoung. @ MarkStorey-Smith: я могу повысить эффективность формулы, если вы дадите мне список уровней, которые находятся в Salaryи Ageизмерении.
Бенуа