Я понимаю, что функция InterpolateRGBColors возвращает цвет по положению значения от 0 до 1 ... Таким образом, кажется, что это возможно только с процентами, а не с числами ...

Есть ли способ иметь такую ​​же функциональность, но на основе минимальных и максимальных значений, возвращаемых в наборе?

Я хочу присвоить цвета моей мере, но в диапазоне от min ([Measures]. [NbSejours]) до max ([Measures]. [NbSejours]) (не от 0 до 1) ...

WITH 
MEMBER [Measures].[color] AS 
    InterpolateRGBColors(
        [Measures].[NbSejours] 
        ,rgb(176,224,230)
        ,rgb(135,206,235)
        ,rgb(0,191,255)
        ,rgb(100,149,237)
        ,rgb(0,0,255)
        ,rgb(0,0,139)
        ,rgb(25,25,112) 
    ), BACK_COLOR=currentCellValue()
SELECT 
  {
    {[Measures].[NbSejours]}
   ,[Measures].[color]
  } ON COLUMNS
 ,{
    NonEmpty
    (
      [Etablissement].[Etablissement].[Etablissement].ALLMEMBERS
     ,[Measures].[NbSejours]
    )
  } ON ROWS
FROM 
(
  SELECT 
    {{[Periode].[Periode].[All-M].&[2013]}} ON 0
  FROM [Cube]
)
CELL PROPERTIES 
  STYLE
 ,CLASSNAME
 ,VALUE
 ,FORMATTED_VALUE;

Есть способ сделать это ?

3
Bertrand Miot 4 Фев 2015 в 13:39

2 ответа

Лучший ответ

InterpolateRGBColors ожидает числовое значение от 0 до 1 для интерполяции. Поэтому нам нужно масштабировать нашу меру, чтобы получить правильные цвета.

Пример есть в нашей живой демонстрации, здесь.

Нам нужно масштабировать [Measures]. [NbSejours] между 0,1. В icCube DistributionFlat и DistributionRank нет двух задокументированных функций.

Неэффективная версия

WITH
  SET [AxisX] AS  NonEmpty([Etablissement].Etablissement].Etablissement].ALLMEMBERS,[Measures].[NbSejours])
  FUNCTION distr(x_) as  DistributionFlat(  [AxisX], [Measures].[NbSejours], x_ )
  MEMBER [Measures].[color] AS 
InterpolateRGBColors(
    distr([Measures].[NbSejours]) 
    ,rgb(176,224,230)
    ,rgb(135,206,235)
    ,rgb(0,191,255)
    ,rgb(100,149,237)
    ,rgb(0,0,255)
    ,rgb(0,0,139)
    ,rgb(25,25,112) 
), BACK_COLOR=currentCellValue()
....

Когда у меня будет немного времени, я напишу версию с использованием векторов (здесь и здесь), который более эффективен, чем в приведенном выше примере. вычислять каждый раз значения для набора.

Надеюсь, это поможет

3
ic3 5 Фев 2015 в 08:46

Я не знаю icCube, поэтому следующее может не сработать, хотя я использовал стандартные функции. Как прокомментировал @George, вы можете использовать стандартную функцию RANK, чтобы найти относительное положение каждого члена.

Вам нужно будет ввести это значение в определение [Measures].[color] ...

WITH 
SET [estMembersOrdered] AS
  ORDER(
      [Etablissement].[Etablissement].[Etablissement].ALLMEMBERS
     ,[Measures].[NbSejours]
     ,BDESC
  )
MEMBER [Measures].[rnkEtablissement] AS 
   RANK(
     [Etablissement].[Etablissement].CURRENTMEMBER
     , [estMembersOrdered]
   )
MEMBER [Measures].[color] AS 
    InterpolateRGBColors(
        [Measures].[NbSejours] 
        ,rgb(176,224,230)
        ,rgb(135,206,235)
        ,rgb(0,191,255)
        ,rgb(100,149,237)
        ,rgb(0,0,255)
        ,rgb(0,0,139)
        ,rgb(25,25,112) 
    ), BACK_COLOR=currentCellValue()
SELECT 
  {
    {[Measures].[NbSejours]}
   ,[Measures].[color]
   ,[Measures].[rnkEtablissement] 
  } ON COLUMNS
 ,{
    NonEmpty
    (
      [Etablissement].[Etablissement].[Etablissement].ALLMEMBERS
     ,[Measures].[NbSejours]
    )
  } ON ROWS
FROM 
(
  SELECT 
    {{[Periode].[Periode].[All-M].&[2013]}} ON 0
  FROM [Cube]
)
CELL PROPERTIES 
  STYLE
 ,CLASSNAME
 ,VALUE
 ,FORMATTED_VALUE;
0
whytheq 4 Фев 2015 в 19:42