动态定义维度范围


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维表SalaryDimAgeDim来创建多维数据集。

SalaryDim表有两列(SalaryKey,SalaryRange)和AgeDim表类似于(ageKey,AgeRange)。我的客户事实表具有:

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

我仍然必须在这些尺寸内定义范围。每次将Excel数据透视表连接到多维数据集时,我只能看到这些硬编码的定义范围。

我的问题是如何直接从数据透视表动态定义范围,而无需创建AgeDimSalaryDim之类的范围尺寸。我不想只停留在维度中定义的范围内。

未定义范围

定义的范围是“ 0-25”,“ 26-30”,“ 31-50”。我可能想将其更改为“ 0-20”,“ 21-31”,“ 32-42”等,并且用户每次都要求不同的范围。

每次更改时,都必须更改尺寸。我如何改善这个过程?

最好在多维数据集中实施一个解决方案,以便连接到多维数据集的任何BI客户端工具都可以定义范围,但是我不介意是否只有使用Excel的好方法。

Answers:


12

如何使用T-SQL做到这一点:

根据要求,这是我以前的答案的替代方法,后者显示了如何使用Excel按用户进行操作。此答案显示了如何使用T-SQL共享/集中执行相同的操作。我不知道该怎么做Cubes,MDX或SSAS,所以Benoit或某个知道的人可以发布与之等效的东西...

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行”。然后在MinVal单元格中输入以下值:0、501、1001和2001(顺序对于SQL Server无关紧要,它将为我们创建它)。关闭表行编辑器,然后执行a SELECT * FROM SalaryRanges查看所有行和范围信息。

2.添加AgeRanges SQL表和视图

执行与上述#1完全相同的步骤,除了将所有出现的“工资”替换为“年龄”。这应该使表“ AgeRangeData”和视图“ AgeRanges”。

在AgeRangeData [MinVal]列中输入以下值:0、15、20、30和40。

3.将范围添加到数据

用CASE表达式替换SELECT语句,以使用以下表达式检索数据和范围:

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.测试魔术

再次转到SSMS中的SalaryRangeData表行编辑器,删除现有行,然后插入以下值: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.在Visual Studio中创建一个BI项目,然后添加 CustomerView

连接到数据库,然后在中添加“ CustomerView视图” Data Source Views作为事实表

数据源视图

2.创建一个多维数据集并定义度量和维

我们只需要customerId,作为衡量客户数量的指标,并且具有与维度相同的事实表

措施

尺寸图

3.将属性添加到维度

将范围作为属性添加到维

4.从Excel连接到多维数据集

将SSAS源添加到Excel

选择多维数据集

5.在Excel中查看多维数据集的数据

在Excel中查看多维数据集

6.对于范围中的任何更改,只需重新处理维度和多维数据集

如果您需要更改范围,更改数据SalaryRangeDataAgeRangeData,然后就重新处理维度和多维数据集


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,并在A3中输入“ 0”,“ 501”,在单元格A4中输入“ 1001”,最后在单元格A5中输入“ 2001”。请注意,执行此操作时,将自动填写MAx和Range列。

2.添加AgeRanges Excel表

现在,创建另一个名为“年龄范围”的新工作表,并执行与上面#1完全相同的步骤,除了将表命名为“ AgeRanges”,并在“最小值”列中用0、15、20、30和0填充单元格A2至A6。 40,为了。同样,“最大”和“范围”值应随您的需要自动填写。

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。回到您的数据透视表并对其进行刷新。za!


我应该提到,您当然也可以通过将表放入SQL并更改SELECT语句以将LOOKUP(.. s)用作子查询来达到相同的效果(由于范围匹配,因此有点混乱,但是肯定可以做到-能够)。我这样做(在Excel中)的原因是

  1. 对于大多数人来说,更改范围会容易一些。即使对于DBA和SQL Developers(如我们),这种方式也更容易一点,因为它更接近UI /结果。
  2. 这使您的用户可以更改自己的范围,而无需打扰您。(我生命中的一大笔钱)
  3. 这也允许每个用户定义自己的范围。

但是,有时实际上不希望用户定义自己的范围。如果您是这种情况,我将很乐于演示如何在SQL中集中地进行操作。


+1并非常感谢,该解决方案的效果惊人,将表格与具有范围的数据全部连接到excel中,是否有办法将此定义的范围与连接到Cube的数据透视表进行连接,我的数据透视表直接连接到了SSAS中的“多维数据集”,如果您可以展示“如何集中进行”,那也很好。
AmmarR 2012年

我可以向您展示如何使用SQL表达式集中进行此操作,并将其发布为替代答案。我无法解决多维数据集/ 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))

文章介绍了如何添加论文calculted成员在Excel中(见“ 创建计算成员/措施,并设置在Excel 2007 OLAP数据透视表 ”部分)。遗憾的是,Excel中没有用于此的UI。但是,您可以找到支持MDX语言的BI客户端,该客户端允许在查询中定义您的范围。


谢谢@Benoit,我正在尝试使用与您建议的概念相同的概念在自己的多维数据集中添加计算字段,但是我似乎还没有工作,该过程有点冗长并且不熟悉,我会尝试使用excel以及
AmmarR

谢谢@RBarryYoung。@ MarkStorey-Smith:如果您将SalaryAge维度中的级别列表提供给我,则可以提高公式效率。
Benoit
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.