Boyuttaki Bir Aralığı Dinamik Olarak Tanımlama


18

Her küp inşa etmeye karar verdiğimde karşılaştığım bir sorun var ve henüz üstesinden gelmek için bir yol bulamadım.

Sorun, kullanıcının boyutta sabit kodlamaya gerek kalmadan bir dizi şeyi otomatik olarak tanımlamasına nasıl izin verileceğidir. Sorunumu bir örnekte açıklayacağım.

Müşteriler adında bir masam var :

Tablo Yapısı

tablodaki veriler:

Verileri içeren tablo

Ben pivot tarzı ve grupta verileri görüntülemek isteyen Maaş ve Age aşağıda gibi tanımlanmış aralıklarda:

Tanımlı Aralıklı Verileri içeren Tablo

Bu komut dosyasını yazdım ve aralıkları tanımladım:

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

Aralıklarım sabit kodlanmış ve tanımlanmıştır. Verileri Excel'e kopyalayıp bir pivot tabloda görüntülediğimde, aşağıdaki gibi görünür:

Pivot Tablodaki Veriler

Benim sorunum, Müşteriler tablosunu bir olgu tablosuna dönüştürerek bir küp oluşturmak ve SalaryDim ve AgeDim 2 boyut tabloları oluşturmak istiyorum .

SalaryDim Tablo 2 sütun (sahiptir SalaryKey, SalaryRange ) ve AgeDim tablosu (benzerdir ageKey, Yaş Aralığı ). Benim Müşteri özellik tablosu vardır:

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

Aralıklarımı hala bu boyutlar içinde tanımlamam gerekiyor. Küpüme bir Excel pivotu her bağladığımda, yalnızca bu kodlanmış tanımlı aralıkları görebiliyorum.

Benim sorum AgeDim ve SalaryDim gibi aralık boyutları oluşturmadan aralıkların doğrudan pivot tablodan dinamik olarak nasıl tanımlanacağıdır . Yalnızca boyutta tanımlanan aralıklara bağlı kalmak istemiyorum.

Tanımlı Aralık Yok

Tanımlanan aralık '0-25', '26 -30 ', '31-50' dir. Bunu '0-20', '21 -31 ', '32 -42' ve benzeri olarak değiştirmek isteyebilirim ve kullanıcılar her seferinde farklı aralıklar ister.

Her değiştirdiğimde boyutu değiştirmem gerekiyor. Bu süreci nasıl geliştirebilirim?

Küpte bir çözüm bulunması harika olurdu, böylece küpe bağlanan BI istemci aracı ne olursa olsun aralıkları tanımlayabilir, ancak yalnızca Excel'i kullanmanın iyi bir yolu olup olmadığını umursamıyorum.

Yanıtlar:


12

T-SQL İLE NASIL YAPILIR:

İstendiği gibi bu, Excel ile kullanıcı başına nasıl yapılacağını gösteren önceki cevabımın bir alternatifidir. Bu cevap, T-SQL kullanılarak paylaşılan / merkezi olarak aynı şeyin nasıl yapılacağını gösterir. Bunun için Küpler, MDX veya SSAS şeylerini nasıl yapacağımı bilmiyorum, bu yüzden belki Benoit veya eşdeğerini gönderebileceğini bilen biri ...

1. SalaryRanges SQL Tablosu Ekleme ve Görüntüleme

Aşağıdaki komutla "SalaryRangeData" adlı yeni bir tablo oluşturun:

Create Table SalaryRangeData(MinVal INT Primary Key)

Şu komutla bir Görünüm'e sarılarak hesaplanmış sütunlar ekleyin:

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'de tabloya sağ tıklayın ve "İlk 200 Satırı Düzenle" yi seçin. Sonra MinVal hücrelerine aşağıdaki değerleri girin: 0, 501, 1001 ve 2001 (sipariş SQL Server için önemli değil, bizim için yaratacaktır). Tablo satırı düzenleyicisini kapatın ve SELECT * FROM SalaryRangestüm satırları ve aralık bilgilerini görmek için a yapın.

2. AgeRanges SQL Tablosu Ekleme ve Görüntüleme

"Maaş" ın tüm tekrarlarını "Yaş" ile değiştirmek dışında, yukarıdaki # 1 ile aynı adımları uygulayın. Bu tablo "AgeRangeData" ve "AgeRanges" görünümünü yapmalıdır.

AgeRangeData [MinVal] sütununa şu değerleri girin: 0, 15, 20, 30 ve 40.

3. Verilere Aralık Ekle

Veri ve aralıkları almak için SELECT ifadenizi CASE ifadeleriyle değiştirin:

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. Başka Her Şey, Şimdi Aynı

Buradan sonra, şu anda olduğu gibi her şeyi yapın. Aralıkların tümü PivotTable'ınızda şu anda olduğu gibi görünmelidir.

5. Büyüyü Test Edin

SSMS'deki SalaryRangeData tablo satırı düzenleyicisine tekrar gidin ve mevcut satırları silin ve ardından şu değerleri ekleyin: 0, 101, 201, 301, ... 2001 (yine, T-SQL çözümü için sipariş önemli değildir) . PivotTable'ınıza geri dönün ve verileri yenileyin. Tıpkı Excel çözümü gibi, PivotTable aralıkları da otomatik olarak değiştirilmelidir.


İlave

KÜP NASIL EKLENİR:

1. Bir Görünüm Oluşturun

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'da bir BI Projesi oluşturun ve CustomerView

Veritabanına bağlanın ve CustomerViewGörünüm'ü Data Source ViewsOlgu tablosuna ekleyin

Veri Kaynağı Görünümleri

2. Bir küp oluşturun ve Ölçü ve Boyut Tanımlayın

sadece müşteri sayısı için bir ölçü olarak customerId'ye ihtiyacımız var ve bir boyutla aynı olgu tablosuna sahip olacağız

Ölçümler

boyutlar

3. Boyuta Nitelikler Ekleme

Boyutlara Nitelikler olarak aralık ekleyin

4. Excel'den Küp'e bağlanın

Excel'e SSAS kaynağı ekleme

Küpü seçin

5. Excel'de küpün Verilerini Görüntüleme

Küpü Excel'de görüntüleme

6. Aralıklardaki herhangi bir değişiklik için Boyut ve küpü yeniden işleyin

Aralıkları değiştirmeniz gerekirse SalaryRangeDatave içindeki verileri değiştirin AgeRangeDatave ardından boyutları ve küpü yeniden işleyin


8

EXCEL İLE NASIL YAPILIR

Excel'de bunu nasıl yapacağım ...

1. SalaryRanges Excel Tablosu Ekleyin

Yeni bir çalışma sayfası ekleyin, buna "Maaş Aralıkları" deyin. Birinci satırda "Min", "Max" ve "Range" metin başlıklarını bu sırayla ekleyin (sırasıyla A1, A2, A3 hücreleri olmalıdır).

B2 hücresine aşağıdaki formülü ekleyin:

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

C2 hücresine şu formülü ekleyin:

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

İhtiyacınız olabilecek maksimum satır sayısı için bu iki formülü B ve C sütunlarına otomatik olarak doldurun (diyelim ki 30).

Ardından, tüm aralığı seçin (A1..C31). Ekle sekmesine gidin ve bu aralığı bir Excel Tablosuna (bunlar "Listeler" olarak adlandırılır) değiştirmek için Tablo düğmesini tıklayın. Tablo Araçları Tasarımı sekmesinde, bu tablonun adını "SalaryRanges" olarak değiştirin.

Şimdi Min sütununda A2 hücresine gidin ve A3'e "0", "501", A4 hücresine "1001" ve son olarak A5 hücresine "2001" yazın. Bunu yaparken, MAx ve Range sütunlarının otomatik olarak doldurulduğunu unutmayın.

2. AgeRanges Excel Tablosu Ekle

Şimdi "Yaş Aralıkları" adlı başka bir yeni çalışma sayfası oluşturun ve bu tabloya "AgeRanges" deyin ve Min sütunu A2 - A6 arasındaki hücreleri 0, 15, 20, 30 ve 40. Yine, Max ve Range değerleri gittikçe otomatik olarak doldurulmalıdır.

3. Verileri Alın

Veritabanından verileri daha önce yaptığınız gibi Excel çalışma kitabınıza alın (PivotTable'ı henüz yapmayın, aşağıda yapıyoruz), ancak AgeRange ve SalaryRange büyük / küçük harf işlevi sütunlarını kaldırmanız gerekir.

4. Maaş ve Yaş Aralığı sütunlarını Verilerinize ekleyin

Verilerinizin bulunduğu sayfaya bir "SalaryRange" ve "AgeRange" sütunu ekleyin. SalaryRange sütununda, aşağıdaki formülü otomatik olarak doldurun ("D" nin Maaş sütunu olduğunu varsayar):

=LOOKUP(D2,SalaryRanges)

Ve bu formülü AgeRange sütununa otomatik olarak doldurun ("C" nin Yaş sütunu olduğu varsayılarak):

=LOOKUP(C2,AgeRanges)

5. PivotTable'ınızı yapın

Bunu daha önce yaptığınız gibi yapın. Yaş ve Maaş aralığı değeri / etiketlerinin seçtiğiniz aralıklarla eşleştiğini unutmayın.

6. Büyüyü Test Edin

Şimdi eğlenceli kısım. SalaryRanges çalışma sayfasına gidin ve 0, sonra 101, 201, 301, ... 2001'den başlayarak Min sütununu yeniden girin. PivotTable'a geri dönün ve yenileyin. Shazaam!


Tabii ki SQL'de Tablolar koyarak ve LOOKUP (..) s alt sorgu olarak (aralık eşleme nedeniyle biraz dağınık ama kesinlikle yapmak- yapabilmek). Bu şekilde yapmamın nedeni (Excel'de)

  1. Aralıkları değiştirmek çoğu insan için biraz daha kolaydır. DBA'lar ve SQL Geliştiricileri (bizim gibi) için bile, UI / sonuçlara daha yakın olduğu için bu yol biraz daha kolaydır.
  2. Bu, kullanıcılarınızın sizi rahatsız etmeden kendi aralıklarını değiştirmesine olanak tanır. (hayatımda BÜYÜK bir artı)
  3. Bu aynı zamanda her kullanıcının kendi aralıklarını tanımlamasını sağlar.

Ancak, bazen kullanıcıların kendi aralıklarını tanımlamaları istenmez . Sizin için durum buysa, bunun yerine merkezi olarak nasıl yapılacağını göstermekten memnuniyet duyarız.


+ 1 ve Teşekkürler çözüm çok çalışıyor, tabloyu tüm excel aralıklarıyla veriye bağlayarak, bu tanımlanmış aralıkları Cube'a bağlı pivot tabloya bağlamanın bir yolu var mı, pivotlarım doğrudan bağlı SSAS küpü ve ayrıca "merkezi olarak nasıl yapılacağını" göstermeniz harika olur.
AmmarR

SQL ifadeleri ile nasıl merkezi olarak yapılacağını gösterebilirim, bunu alternatif bir cevap olarak göndereceğim. Küp / SSAS sorunlarını ele alamıyorum çünkü maalesef bilmiyorum. Evet, gerekir bunları bilmek ve başkası o adrese sahip olacak, böylece Keşke olsaydı, ama yok.
RBarryYoung

5

MDX dili ile aralıkları tanımlayan özel üyeler oluşturabilirsiniz. Aşağıdaki ifade, 501 ile 1000 arasındaki tüm maaşları temsil eden hesaplanmış bir üye tanımlamıştır:

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

Aynı şeyi yaş boyutuyla da yapabilirsiniz:

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

Bu makalede , Excel'de hesaplanmış tezlerin nasıl ekleneceği açıklanmaktadır (bkz. ' Excel 2007 OLAP PivotTable'larında hesaplanmış üyeler / hesaplamalar ve kümeler oluşturma ' bölümü). Ne yazık ki Excel'de bunun için kullanıcı arayüzü yok. Bununla birlikte , sorgularda Aralıklarınızı tanımlamanıza izin veren MDX dilini destekleyen BI istemcileri bulabilirsiniz .


teşekkürler @Benoit, kendi önerdiğiniz aynı kavram ile küp hesaplanan alanları eklemeye çalışıyorum ama henüz çalışmıyor gibi görünüyor, süreç biraz uzun ve aşina değil excel ile deneyeceğim yanı sıra,
AmmarR

Teşekkürler @RBarryYoung. @ MarkStorey-Smith: Bana Salaryve Ageboyutundaki düzeylerin listesini verirseniz formül verimliliğini artırabilirim .
Benoit
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.