Secara dinamis tentukan rentang dalam dimensi

18

Saya memiliki masalah yang saya hadapi setiap kali saya memutuskan untuk membangun kubus, dan saya belum menemukan cara untuk mengatasinya.

Masalahnya adalah bagaimana memungkinkan pengguna untuk menentukan berbagai hal secara otomatis tanpa harus membuat kode dalam dimensi. Saya akan menjelaskan masalah saya dalam sebuah contoh.

Saya memiliki meja yang disebut Pelanggan :

Struktur Tabel

ini adalah data dalam tabel:

Tabel dengan data

Saya ingin menampilkan data dalam gaya pivot dan mengelompokkan Gaji dan Usia dalam rentang yang ditentukan seperti di bawah ini:

Tabel dengan Data dengan Rentang yang Ditentukan

Saya menulis skrip ini dan menetapkan rentang:

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

Rentang saya dikodekan dan ditentukan dengan keras. Ketika saya menyalin data ke Excel dan melihatnya dalam tabel pivot, itu muncul seperti di bawah ini:

Data dalam Tabel Pivot

Masalah saya adalah saya ingin membuat kubus dengan mengubah tabel Pelanggan menjadi tabel fakta dan membuat tabel 2 dimensi SalaryDim & AgeDim .

The SalaryDim tabel memiliki 2 kolom ( SalaryKey, SalaryRange ) dan AgeDim meja mirip ( ageKey, RentangUsia ). Tabel fakta Pelanggan saya memiliki:

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

Saya masih harus menentukan rentang saya di dalam dimensi ini. Setiap kali saya menghubungkan pivot Excel ke kubus saya, saya hanya bisa melihat rentang yang ditentukan dengan hardcode ini.

Pertanyaan saya adalah bagaimana menentukan rentang secara dinamis dari tabel pivot secara langsung, tanpa membuat dimensi rentang seperti AgeDim dan SalaryDim . Saya tidak ingin hanya terjebak pada rentang yang ditentukan dalam dimensi.

Tidak Ada Rentang Ditentukan

Kisaran yang ditentukan adalah '0-25', '26 -30 ', '31 - 50'. Saya mungkin ingin mengubahnya ke '0-20', '21 -31 ', '32 -42' dan seterusnya, dan pengguna meminta rentang yang berbeda setiap waktu.

Setiap kali saya mengubahnya, saya harus mengubah dimensi. Bagaimana saya bisa meningkatkan proses ini?

Akan lebih bagus untuk memiliki solusi yang diterapkan dalam kubus, sehingga alat klien BI apa pun yang tersambung ke kubus dapat menentukan rentang, tapi saya tidak keberatan jika ada cara yang baik menggunakan Excel saja.

AmmarR
sumber

Jawaban:

12

CARA MELAKUKANNYA DENGAN T-SQL:

Seperti yang diminta ini adalah alternatif dari jawaban saya sebelumnya yang menunjukkan bagaimana melakukannya per-pengguna dengan Excel. Jawaban ini menunjukkan bagaimana melakukan hal yang sama dibagikan / terpusat menggunakan T-SQL sebagai gantinya. Saya tidak tahu bagaimana melakukan Cubes, MDX atau hal-hal SSAS untuk ini, jadi mungkin Benoit atau seseorang yang tahu yang dapat memposting yang setara ...

1. Tambahkan Tabel SQL SalaryRanges dan Lihat

Buat tabel baru yang disebut "SalaryRangeData" dengan perintah berikut:

Create Table SalaryRangeData(MinVal INT Primary Key)

Tambahkan kolom terhitung dengan membungkusnya dalam Tampilan dengan perintah ini:

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

Klik kanan pada tabel dalam SSMS dan pilih "Edit Top 200 Rows". Kemudian masukkan nilai berikut ke dalam sel MinVal: 0, 501, 1001, dan 2001 (pesanan tidak masalah untuk SQL Server, itu akan membuatnya untuk kita). Tutup editor baris-tabel dan lakukan SELECT * FROM SalaryRangesuntuk melihat semua informasi baris dan rentang.

2. Tambahkan AgeRanges SQL Table and View

Lakukan langkah yang sama persis seperti pada # 1 di atas, kecuali ganti semua kemunculan "Gaji" dengan "Usia". Ini harus membuat tabel "AgeRangeData" dan tampilan "AgeRanges".

Masukkan nilai berikut ke dalam kolom AgeRangeData [MinVal]: 0, 15, 20, 30, dan 40.

3. Tambahkan Rentang ke Data

Ganti pernyataan SELECT Anda dengan ekspresi KASUS untuk mengambil data dan rentang dengan yang berikut:

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. Semuanya Lain, Sama Seperti Sekarang

Mulai sekarang, lakukan saja semua yang sama seperti Anda saat ini. Kisaran semua akan muncul di PivotTable Anda seperti yang saat ini dilakukan.

5. Uji Sihir

Pergi ke editor baris tabel SalaryRangeData di SSMS lagi dan hapus baris yang ada dan kemudian masukkan nilai berikut: 0, 101, 201, 301, ... 2001 (sekali lagi, pesanan tidak masalah untuk solusi T-SQL) . Kembali ke PivotTable Anda dan segarkan data. Dan seperti solusi Excel, rentang PivotTable harus diubah secara otomatis.


Tambahan

BAGAIMANA MENAMBAHKANNYA KE CUBE:

1. Buat Tampilan

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. Buat Proyek BI di Visual studio dan tambahkan CustomerView

Sambungkan ke Database, dan tambahkan CustomerViewLihat di Data Source Viewsmenjadi tabel Fakta

Tampilan Sumber Data

2. Buat kubus dan Tentukan Ukuran & Dimensi

kita hanya perlu customerId, sebagai ukuran untuk jumlah pelanggan dan akan memiliki tabel fakta yang sama sebagai dimensi

Pengukuran

Ukuran

3. Tambahkan Atribut ke Dimensi

Tambahkan rentang sebagai Atribut ke Dimensi

4. Sambungkan ke Cube dari Excel

Tambahkan sumber SSAS ke Excel

Pilih kubus

5. Lihat Data kubus di Excel

Lihat Kubus di Excel

6. untuk Perubahan apa pun di Ranges, hanya ulang proses Dimensi & kubus

jika Anda perlu untuk mengubah Ranges, mengubah data dalam SalaryRangeDatadan AgeRangeDatadan kemudian hanya memproses ulang dimensi dan kubus

RBarryYoung
sumber
8

BAGAIMANA CARA MELAKUKAN INI DENGAN EXCEL

Inilah cara saya akan melakukannya di Excel ...

1. Tambahkan Tabel Excel SalaryRanges

Masukkan lembar kerja baru, sebut saja "Rentang Gaji". Di baris satu tambahkan header teks "Min", "Max" dan "Range" dalam urutan itu (masing-masing harus sel A1, A2, A3).

Dalam sel B2 tambahkan rumus berikut:

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

Dalam sel C2 tambahkan rumus ini:

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

IsiOtomatis kedua rumus ini ke bawah kolom B dan C untuk jumlah baris maksimum yang mungkin Anda perlukan (misalkan 30).

Selanjutnya, pilih seluruh rentang (A1..C31). Pergi ke tab Sisipkan dan klik tombol Tabel untuk mengubah rentang ini menjadi Tabel Excel (ini dulu disebut "Daftar"). Di tab Desain Alat Meja, ubah nama tabel ini menjadi "SalaryRanges".

Sekarang, buka sel A2 di kolom Min dan masukkan "0", "501" di A3, "1001" di sel A4 dan akhirnya "2001" di sel A5. Perhatikan bahwa saat Anda melakukan ini, kolom MAx dan Range secara otomatis diisi.

2. Tambahkan Tabel Excel AgeRanges

Sekarang buat lembar kerja baru lain bernama "Rentang Usia", dan lakukan langkah yang sama persis seperti pada # 1 di atas, kecuali panggil tabel ini "AgeRanges" dan di kolom Min isi sel A2 hingga A6 dengan 0, 15, 20, 30, dan 40, dalam urutan. Sekali lagi, nilai Maks dan Rentang akan secara otomatis terisi saat Anda mulai.

3. Dapatkan Data

Dapatkan data dari database ke buku kerja Excel Anda seperti yang Anda lakukan sebelumnya (jangan membuat PivotTable, kami melakukannya di bawah), kecuali Anda harus menghapus kolom fungsi case AgeRange dan SalaryRange.

4. Tambahkan kolom Gaji dan Rentang Usia ke Data Anda

Di lembar tempat data Anda, tambahkan kolom "SalaryRange" dan "AgeRange". Di kolom SalaryRange, isi otomatis formula berikut (menganggap bahwa "D" adalah kolom gaji):

=LOOKUP(D2,SalaryRanges)

Dan isi otomatis rumus ini ke kolom AgeRange (dengan asumsi bahwa "C" adalah kolom Usia):

=LOOKUP(C2,AgeRanges)

5. Buat PivotTable Anda

Lakukan ini seperti yang Anda lakukan sebelumnya. Perhatikan bahwa nilai / label rentang Usia dan Gaji cocok dengan rentang yang Anda pilih.

6. Uji Sihir

Sekarang bagian yang menyenangkan. Buka lembar kerja SalaryRanges dan masukkan kembali kolom Min, mulai dari 0, lalu 101, 201, 301, ... 2001. Kembali kepada Anda PivotTable dan segarkan saja. Shazaam!


Saya harus menyebutkan bahwa tentu saja Anda juga dapat mencapai efek yang sama dengan meletakkan Tabel dalam SQL dan mengubah pernyataan SELECT Anda untuk melakukan LOOKUP (..) sebagai subquery (sedikit berantakan karena range-matching, tetapi pasti melakukan- sanggup). Alasan saya melakukannya dengan cara ini (dalam Excel) adalah

  1. Mengubah rentang agak lebih mudah bagi kebanyakan orang. Bahkan untuk Pengembang DBA dan SQL (seperti kami), cara ini sedikit lebih mudah hanya karena lebih dekat dengan UI / hasil.
  2. Ini memungkinkan pengguna Anda untuk mengubah rentang mereka sendiri tanpa harus mengganggu Anda. (Nilai tambah BESAR dalam hidup saya)
  3. Ini juga memungkinkan setiap pengguna untuk menentukan rentang mereka sendiri.

Namun, kadang-kadang sebenarnya tidak diinginkan jika pengguna menentukan rentang mereka sendiri. Jika itu yang terjadi untuk Anda, saya akan dengan senang hati menunjukkan bagaimana melakukannya secara terpusat, dalam SQL.

RBarryYoung
sumber
+1 dan Terima kasih banyak solusinya bekerja luar biasa, menghubungkan tabel dengan data dengan rentang semua di excel, Apakah ada cara untuk menghubungkan rentang yang ditentukan ini dengan tabel pivot yang terhubung ke Cube, pivot saya terhubung langsung ke kubus di SSAS, dan juga akan lebih bagus jika Anda bisa menunjukkan "bagaimana melakukannya secara terpusat".
AmmarR
Saya dapat menunjukkan kepada Anda bagaimana melakukannya secara terpusat dengan ekspresi SQL, saya akan mempostingnya sebagai jawaban alternatif. Saya tidak dapat mengatasi masalah Cube / SSAS karena sayangnya saya tidak mengetahuinya. Ya, saya harus mengenal mereka dan berharap saya tahu, tetapi saya tidak tahu, jadi orang lain harus mengatasinya.
RBarryYoung
5

Dengan bahasa MDX Anda dapat membuat anggota khusus yang akan menentukan rentang. Ungkapan berikut mendefinisikan anggota terhitung yang mewakili semua gaji antara 501 dan 1000:

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

Anda dapat melakukan hal yang sama dengan dimensi usia:

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

Artikel ini menjelaskan cara menambahkan tesis para anggota yang dikulturkan ini di Excel (lihat bagian ' Membuat anggota / tindakan yang dihitung dan set di bagian Excel 2007 OLAP PivotTables '). Sayangnya tidak ada UI di Excel untuk ini. Namun demikian, Anda dapat menemukan klien BI yang mendukung bahasa MDX , yang memungkinkan untuk menentukan Ranges Anda di kueri.

Benoit
sumber
terima kasih @enoit, saya mencoba untuk menambahkan bidang terhitung dalam kubus itu sendiri dengan konsep yang sama yang Anda sarankan tetapi saya tampaknya belum berfungsi, prosesnya agak panjang dan saya tidak terbiasa dengan itu saya akan mencobanya dengan excel juga,
AmmarR
Terima kasih @RarryYoung. @ MarkStorey-Smith: Saya dapat meningkatkan efisiensi rumus, jika Anda memberi saya daftar level yang ada dalam Salarydan Agedimensi.
Benoit