차원에서 범위를 동적으로 정의


18

큐브를 만들 때마다 직면하는 문제가 있으며 아직이 문제를 극복 할 방법을 찾지 못했습니다.

문제는 사용자가 차원에서 하드 코딩 할 필요없이 다양한 사물을 자동으로 정의 할 수있게하는 방법입니다. 예를 들어 내 문제를 설명하겠습니다.

Customers 라는 테이블이 있습니다 .

테이블 구조

이것은 테이블의 데이터입니다.

데이터가있는 테이블

피벗 스타일로 데이터를 표시하고 급여연령 을 아래와 같이 정의 된 범위로 그룹화하고 싶습니다.

범위가 정의 된 데이터가있는 테이블

이 스크립트를 작성하고 범위를 정의했습니다.

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로 복사하고 피벗 테이블에서 볼 때 아래와 같이 나타납니다.

피벗 테이블의 데이터

내 문제는 Customers 테이블을 사실 테이블로 변환하여 큐브를 만들고 SalaryDim & AgeDim 2 차원 테이블을 만들고 싶습니다 .

SalaryDim의 표 2 열 (갖는다 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 만 사용하는 좋은 방법이 있는지는 상관하지 않습니다.

답변:


12

T-SQL로이를 수행하는 방법 :

요청에 따라 이것은 Excel에서 사용자별로 수행하는 방법을 보여준 이전 답변의 대안입니다. 이 답변은 대신 T-SQL을 사용하여 공유 / 중앙 적으로 동일한 작업을 수행하는 방법을 보여줍니다. 큐브, 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에서 테이블을 마우스 오른쪽 버튼으로 클릭하고 "Edit Top 200 Rows"를 선택하십시오. 그런 다음 MinVal 셀에 0, 501, 1001 및 2001 값을 입력하십시오 (SQL Server에는 순서가 중요하지 않으므로이 값이 생성됩니다). 테이블 행 편집기를 닫고 a SELECT * FROM SalaryRanges를 수행하여 모든 행과 범위 정보를보십시오.

2. AgeRanges SQL 테이블 및 뷰 추가

"Salary"의 모든 항목을 "Age"로 바꾸는 것을 제외하고는 위의 # 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. 마술을 시험하십시오

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에서 Cube에 연결

Excel에 SSAS 소스 추가

큐브를 선택하십시오

5. Excel에서 큐브의 데이터를 봅니다.

Excel에서 큐브보기

6. 범위를 변경하면 차원 및 큐브를 다시 처리하십시오.

범위를 변경해야하는 경우 SalaryRangeData및 의 데이터를 변경 AgeRangeData한 다음 치수와 큐브를 다시 처리하십시오.


8

엑셀과 함께하는 방법

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"로 변경하십시오.

이제 Min 열의 A2 셀로 이동하여 A3에 "0", "501", A4에 "1001"을 입력하고 마지막으로 A5에 "2001"을 입력하십시오. 이렇게하면 MAx 및 Range 열이 자동으로 채워집니다.

2. AgeRanges Excel 테이블 추가

이제 "Age Ranges"라는 새 워크 시트를 만들고이 테이블을 "AgeRanges"라고 부르고 Min 열의 셀 A2에서 A6까지 0, 15, 20, 30 및 40, 순서대로. 다시 말하지만, 최대 및 범위 값은 자동으로 채워집니다.

3. 데이터 가져 오기

AgeRange 및 SalaryRange case 함수 열을 제거해야한다는 점을 제외하고 이전과 마찬가지로 데이터베이스에서 Excel 통합 문서로 데이터를 가져옵니다 (아직 피벗 테이블을 만들지 마십시오).

4. 급여 및 연령대 열을 데이터에 추가

데이터가있는 시트에서 "SalaryRange"및 "AgeRange"열을 추가하십시오. SalaryRange 열에서 다음 수식을 자동 완성합니다 ( "D"가 Salary 열이라고 가정).

=LOOKUP(D2,SalaryRanges)

이 수식을 AgeRange 열에 자동 완성합니다 ( "C"가 Age 열인 경우).

=LOOKUP(C2,AgeRanges)

5. 피벗 테이블 만들기

이전과 마찬가지로이 작업을 수행하십시오. 연령 및 급여 범위 값 / 라벨은 선택한 범위와 일치합니다.

6. 마술을 시험하십시오

이제 재미있는 부분. SalaryRanges 워크 시트로 이동하여 0, 101, 201, 301, ... 2001에서 시작하여 Min 열을 다시 입력하십시오. 피벗 테이블로 돌아가서 새로 고치십시오. 샤자!


물론 테이블을 SQL에 넣고 하위 쿼리와 같이 LOOKUP (..)을 수행하도록 SELECT 문을 변경하여 동일한 효과를 얻을 수 있음을 언급해야합니다 (범위 일치 때문에 약간 지저분하지만 확실히 할 수 있는). 내가 이런 식으로 (엑셀에서) 한 이유는

  1. 범위를 변경하는 것은 대부분의 사람들에게 조금 더 쉽습니다. DBA 및 SQL 개발자 (예 : 우리)의 경우에도이 방법은 UI / 결과에 더 가깝기 때문에 조금 더 쉽습니다.
  2. 이를 통해 사용자는 귀찮게하지 않고도 자신의 범위를 변경할 수 있습니다. (내 인생에서 큰 플러스)
  3. 또한 각 사용자가 자신의 범위를 정의 할 수 있습니다.

그러나 때때로 사용자가 자신의 범위를 정의하도록하는 것은 바람직하지 않습니다 . 이 경우 SQL 대신 중앙에서 수행하는 방법을 보여 드리겠습니다.


+1과 감사합니다. 솔루션이 훌륭하게 작동하여 테이블을 데이터와 범위가 모두 잘 연결되어 있습니다.이 정의 된 범위를 큐브에 연결된 피벗 테이블과 연결하는 방법이 있습니까? 내 피벗은 SSAS에 큐브를 추가하고 "중앙에서 수행하는 방법"을 보여줄 수 있다면 좋을 것입니다.
AmmarR

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))

문서에서는 이러한 계산 된 멤버를 Excel에 추가하는 방법에 대해 설명합니다 ( ' Excel 2007 OLAP 피벗 테이블에서 계산 된 멤버 / 측정 및 집합 만들기 '섹션 참조). 슬프게도 Excel에는 UI가 없습니다. 그럼에도 불구하고 MDX 언어 를 지원하는 BI 클라이언트를 찾을 수 있으므로 쿼리에서 범위를 정의 할 수 있습니다.


@Benoit 덕분에 큐브에 계산 된 필드를 추가하려고하지만 제안하는 것과 같은 개념으로 자체적으로 작동하지만 아직 작동하지 않는 것 같습니다. 프로세스가 약간 길고 익숙하지 않으므로 Excel로 시도합니다. 뿐만 아니라,
AmmarR

감사합니다 @RBarryYoung. @ MarkStorey-Smith : SalaryAge차원 의 수준 목록을 제공하면 수식 효율성을 향상시킬 수 있습니다 .
Benoit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.