Tự động xác định một phạm vi trong một chiều


18

Tôi có một vấn đề mà tôi phải đối mặt mỗi khi tôi quyết định xây dựng một khối lập phương và tôi chưa tìm được cách khắc phục.

Vấn đề là làm thế nào để cho phép người dùng tự động xác định một loạt các thứ mà không cần phải mã hóa chúng theo chiều. Tôi sẽ giải thích vấn đề của tôi trong một ví dụ.

Tôi có một bảng gọi là Khách hàng :

Cấu trúc bảng

đây là dữ liệu trong bảng:

Bảng với dữ liệu

Tôi muốn hiển thị dữ liệu theo kiểu xoay vòng và nhóm lại Mức lươngTuổi theo các phạm vi được xác định như dưới đây:

Bảng với dữ liệu với phạm vi được xác định

Tôi đã viết kịch bản này và xác định các phạm vi:

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

Phạm vi của tôi được mã hóa cứng và xác định. Khi tôi sao chép dữ liệu vào Excel và xem nó trong bảng xoay vòng, nó sẽ xuất hiện như bên dưới:

Dữ liệu trong Bảng Pivot

Vấn đề của tôi là tôi muốn tạo một khối bằng cách chuyển đổi bảng Khách hàng thành bảng thực tế và tạo bảng 2 chiều SalaryDim & AgeDim .

Bảng SalaryDim có 2 cột ( SalaryKey, SalaryRange ) và bảng AgeDim tương tự ( ageKey, AgeRange ). Bảng thực tế khách hàng của tôi có:

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

Tôi vẫn phải xác định phạm vi của mình trong các kích thước này. Mỗi lần tôi kết nối một trục Excel với khối của mình, tôi chỉ có thể thấy các phạm vi được xác định mã hóa cứng này.

Câu hỏi của tôi là làm thế nào để xác định trực tiếp các phạm vi từ bảng trục, mà không tạo các kích thước phạm vi như AgeDimSalaryDim . Tôi không muốn chỉ bị mắc kẹt trong phạm vi được xác định trong thứ nguyên.

Không xác định phạm vi

Phạm vi được xác định là '0-25', '26 -30 ', '31 - 50'. Tôi có thể muốn thay đổi nó thành '0-20', '21 -31 ', '32 -42', v.v. và người dùng yêu cầu các phạm vi khác nhau mỗi lần.

Mỗi lần thay đổi, tôi phải thay đổi kích thước. Làm thế nào tôi có thể cải thiện quá trình này?

Thật tuyệt vời khi có một giải pháp được triển khai trong khối, do đó, bất kỳ công cụ máy khách BI nào kết nối với khối đều có thể xác định phạm vi, nhưng tôi sẽ không phiền nếu chỉ có cách sử dụng Excel tốt.

Câu trả lời:


12

CÁCH LÀM NÀY VỚI T-SQL:

Theo yêu cầu, đây là một giải pháp thay thế cho câu trả lời trước đây của tôi chỉ ra cách thực hiện cho mỗi người dùng bằng Excel. Câu trả lời này cho thấy cách thực hiện điều tương tự được chia sẻ / tập trung bằng T-SQL thay thế. Tôi không biết cách thực hiện Cubes, MDX hoặc SSAS cho việc này, vì vậy có thể Benoit hoặc ai đó biết rằng có thể đăng bài tương đương ...

1. Thêm bảng SQL SalaryRanges và xem

Tạo một bảng mới gọi là "SalaryRangeData" bằng lệnh sau:

Create Table SalaryRangeData(MinVal INT Primary Key)

Thêm các cột được tính bằng cách gói nó trong Chế độ xem bằng lệnh này:

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

Nhấp chuột phải vào bảng trong SSMS và chọn "Chỉnh sửa 200 hàng hàng đầu". Sau đó nhập các giá trị sau vào các ô MinVal: 0, 501, 1001 và 2001 (thứ tự không quan trọng đối với SQL Server, nó sẽ tạo ra cho chúng tôi). Đóng trình chỉnh sửa hàng của bảng và thực hiện SELECT * FROM SalaryRangesđể xem tất cả các thông tin về hàng và phạm vi.

2. Thêm bảng SQL và khung nhìn AgeRanges

Thực hiện các bước chính xác như trong # 1 ở trên, ngoại trừ thay thế tất cả các lần xuất hiện của "Mức lương" bằng "Tuổi". Điều này sẽ làm cho bảng "AgeRangeData" và chế độ xem "AgeRanges".

Nhập các giá trị sau vào cột AgeRangeData [MinVal]: 0, 15, 20, 30 và 40.

3. Thêm phạm vi vào dữ liệu

Thay thế câu lệnh CHỌN của bạn bằng các biểu thức CASE để truy xuất dữ liệu và phạm vi bằng biểu thức sau:

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. Mọi thứ khác, giống như bây giờ

Từ đây trở đi, chỉ cần làm mọi thứ giống như bạn hiện tại. Tất cả các phạm vi sẽ hiển thị trong PivotTable của bạn như hiện tại.

5. Kiểm tra ma thuật

Chuyển đến trình soạn thảo hàng bảng SalaryRangeData trong SSMS một lần nữa và xóa các hàng hiện có rồi chèn các giá trị sau: 0, 101, 201, 301, ... 2001 (một lần nữa, thứ tự không quan trọng đối với giải pháp T-SQL) . Quay trở lại PivotTable của bạn và làm mới dữ liệu. Và giống như giải pháp Excel, phạm vi PivotTable sẽ được tự động thay đổi.


Thêm vào

LÀM THẾ NÀO ĐỂ THÊM VÀO MỘT CUBE:

1. Tạo chế độ xem

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. Tạo aa BI Project trong Visual studio và thêm CustomerView

Kết nối với Cơ sở dữ liệu và thêm CustomerViewChế độ xem trong Data Source Viewsbảng Sự kiện

Lượt xem nguồn dữ liệu

2. Tạo một khối lập phương và xác định số đo & kích thước

chúng tôi chỉ cần khách hàng, như một thước đo cho số lượng khách hàng và sẽ có cùng bảng thực tế với thứ nguyên

Biện pháp

Kích thước

3. Thêm thuộc tính cho kích thước

Thêm phạm vi làm Thuộc tính cho Thứ nguyên

4. Kết nối với Cube từ Excel

Thêm nguồn SSAS vào Excel

Chọn khối

5. Xem dữ liệu của khối trong Excel

Xem khối trong Excel

6. đối với mọi thay đổi trong Phạm vi, chỉ cần xử lý lại Kích thước & khối

nếu bạn cần phải thay đổi Phạm vi, thay đổi dữ liệu trong SalaryRangeDataAgeRangeDatavà sau đó chỉ cần tái xử lý các kích thước và khối lập phương


8

CÁCH LÀM NÀY VỚI EXCEL

Đây là cách tôi sẽ làm trong Excel ...

1. Thêm bảng lương SalaryRanges

Chèn một bảng tính mới, gọi nó là "Phạm vi mức lương". Trong hàng một, thêm các tiêu đề văn bản "Tối thiểu", "Tối đa" và "Phạm vi" theo thứ tự đó (nên lần lượt là các ô A1, A2, A3).

Trong ô B2 thêm công thức sau:

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

Trong ô C2 thêm công thức này:

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

Tự động điền hai công thức này xuống các cột B và C cho số lượng hàng tối đa bạn có thể cần (giả sử 30).

Tiếp theo, chọn toàn bộ phạm vi (A1..C31). Đến tab Chèn và bấm vào nút Bảng để thay đổi phạm vi này thành Bảng Excel (chúng được gọi là "Danh sách"). Trong tab Thiết kế Công cụ Bảng, thay đổi tên của bảng này thành "Mức lương".

Bây giờ, đi đến ô A2 trong cột Min và nhập "0", "501" trong A3, "1001" trong ô A4 và cuối cùng là "2001" trong ô A5. Lưu ý rằng khi bạn thực hiện việc này, các cột MAx và Phạm vi sẽ tự động được điền vào.

2. Thêm bảng AgeRanges Excel

Bây giờ tạo một bảng tính mới khác có tên "Phạm vi tuổi" và thực hiện các bước chính xác như trong # 1 ở trên, ngoại trừ gọi bảng này là "AgeRanges" và trong cột Min điền các ô từ A2 đến A6 với 0, 15, 20, 30 và 40, theo thứ tự. Một lần nữa, các giá trị Max và Range sẽ tự động điền vào khi bạn đi.

3. Lấy dữ liệu

Lấy dữ liệu từ cơ sở dữ liệu vào sổ làm việc Excel của bạn giống như bạn đã làm trước đây (chưa tạo PivotTable, chúng tôi sẽ làm điều đó bên dưới), ngoại trừ bạn nên xóa các cột chức năng trường hợp AgeRange và SalaryRange.

4. Thêm các cột Mức lương và Độ tuổi vào Dữ liệu của bạn

Trong trang tính có dữ liệu của bạn, hãy thêm cột "SalaryRange" và "AgeRange". Trong cột SalaryRange, tự động điền công thức sau (giả sử rằng "D" là cột Mức lương):

=LOOKUP(D2,SalaryRanges)

Và tự động điền công thức này vào cột AgeRange (giả sử rằng "C" là cột Age):

=LOOKUP(C2,AgeRanges)

5. Tạo PivotTable của bạn

Làm điều này giống như bạn đã làm trước đây. Lưu ý rằng giá trị / nhãn Phạm vi tuổi và Mức lương phù hợp với phạm vi bạn chọn.

6. Kiểm tra ma thuật

Bây giờ là phần thú vị. Chuyển đến bảng tính SalaryRanges và nhập lại cột Min, bắt đầu từ 0, sau đó 101, 201, 301, ... 2001. Quay lại với bạn PivotTable và chỉ cần làm mới nó. Chợ!


Tôi nên đề cập rằng tất nhiên bạn cũng có thể đạt được hiệu quả tương tự bằng cách đặt các Bảng trong SQL và thay đổi câu lệnh CHỌN của bạn để thực hiện các LOOKUP (..) dưới dạng truy vấn con (hơi lộn xộn vì phù hợp với phạm vi, nhưng chắc chắn là- có thể). Lý do mà tôi đã làm theo cách này (trong Excel) là

  1. Thay đổi phạm vi dễ dàng hơn một chút đối với hầu hết mọi người. Ngay cả đối với các Nhà phát triển SQL và DBA (như chúng tôi), cách này dễ dàng hơn một chút chỉ vì nó gần với UI / kết quả hơn.
  2. Điều này cho phép người dùng của bạn thay đổi phạm vi của riêng họ mà không phải làm phiền bạn. (một điểm cộng LỚN trong cuộc sống của tôi)
  3. Điều này cũng cho phép mỗi người dùng xác định phạm vi riêng của họ.

Tuy nhiên, đôi khi thật không mong muốn có người dùng xác định phạm vi của riêng họ. Nếu đó là trường hợp của bạn, thay vào đó tôi sẽ vui lòng giải thích cách thực hiện nó một cách tập trung, bằng SQL.


+1 và Cảm ơn rất nhiều giải pháp hoạt động tuyệt vời, kết nối bảng với dữ liệu với các phạm vi tất cả trong excel, Có cách nào để kết nối phạm vi được xác định này với bảng xoay được kết nối với Cube, các trục của tôi được kết nối trực tiếp với khối lập phương trong SSAS, và cũng thật tuyệt nếu bạn có thể chỉ ra "cách thực hiện tập trung".
AmmarR

Tôi có thể chỉ cho bạn cách thực hiện tập trung với các biểu thức SQL, tôi sẽ đăng nó dưới dạng câu trả lời thay thế. Tôi không thể giải quyết các vấn đề về Cube / SSAS vì rất tiếc tôi không biết chúng. Vâng, tôi nên biết họ và tôi ước tôi đã làm, nhưng tôi thì không, vì vậy người khác sẽ phải giải quyết điều đó.
RBarryYoung

5

Với ngôn ngữ MDX, bạn có thể tạo các thành viên tùy chỉnh sẽ xác định phạm vi. Biểu thức sau đây đã xác định một thành viên được tính đại diện cho tất cả các mức lương trong khoảng từ 501 đến 1000:

MEMBER [Salary].[between_500_and_1000] AS Aggregate(Filter([Salary].Members, [Salary].CurrentMember.MemberValue > 500 AND [Salary].CurrentMember.MemberValue <= 1000))

Bạn có thể làm điều tương tự với kích thước tuổi:

MEMBER [Age].[between_0_and_25] AS Aggregate(Filter([Age].Members, [Age].CurrentMember.MemberValue <= 25))

Bài viết này giải thích cách thêm các thành viên được đề xuất trong Excel (xem phần ' Tạo các thành viên / biện pháp được tính toán và các bộ trong Excel 2007 OLAP PivotTables '). Đáng buồn là không có giao diện người dùng trong Excel cho việc này. Tuy nhiên, bạn có thể tìm thấy các máy khách BI hỗ trợ ngôn ngữ MDX , cho phép xác định Phạm vi của bạn trong các truy vấn.


cảm ơn @Benoit, tôi đang cố gắng thêm các trường được tính toán trong khối lập phương với cùng một khái niệm mà bạn đang đề xuất nhưng tôi dường như chưa hoạt động, quá trình này hơi dài và tôi không quen với nó, tôi sẽ thử với excel cũng vậy,
AmmarR

Cảm ơn @RBarryYoung. @ MarkStorey-Smith: Tôi có thể cải thiện hiệu quả của công thức, nếu bạn đưa cho tôi danh sách các cấp độ trong Salaryvà thứ Agenguyên.
Benoit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.