! 제품 버전을 정확하게 입력해 주세요.
제품 버전이 정확하게 기재되어 있지 않은 경우,
최신 버전을 기준으로 안내 드리므로
더욱 빠르고 명확한 안내를 위해
제품 버전을 정확하게 입력해 주세요!

WPF 피벗 그리드에서 데이터를 구성하고 편집하는 방법 > 블로그 & Tips

본문 바로가기

ComponentOne

블로그 & Tips

WPF 피벗 그리드에서 데이터를 구성하고 편집하는 방법

페이지 정보

작성자 GrapeCity 작성일 2021-10-21 15:02 조회 2,913회 댓글 0건

본문

첨부파일

데이터 분석은 기본적으로 대량 데이터를 평가하고 미래 작업을 효율적으로 계획할 기회를 제공하는 결론을 도출해야 합니다. 가장 흔한 예는 수백만 개의 레코드로 구성된 다국적 회사의 전년도 매출 분석일 수 있습니다. 원시 데이터를 간단하게 검토하는 것만으로는 결론에 도달할 수 없습니다. 전년도에 기장된 분기별 수익이나 최고 매출 국가 등의 데이터 분석과 관련된 몇 가지 질문에 대답하는 방식으로 데이터를 구성하고 수치를 집계해야 합니다.


ComponentOne Studio for WPF에서 제공하는 FlexPivot을 사용하면 가능한 최상의 방식으로 데이터를 분석하기 위해 수백만 개의 레코드를 여러 방법으로 구성하고 집계할 수 있습니다. 사용자 편의를 위해 데이터 분석 결과를 그리드, 차트 또는 보고서로 제공할 수 있습니다. FlexPivot 설명서에서 컨트롤이 제공하는 아키텍처와 강력한 기능 집합을 자세히 살펴볼 수 있습니다. 다음 FlexPivot 컨트롤 빠른 보기에서 시작하십시오.

image


이 블로그에서는 FlexPivot이 제공하는 범위 그룹화 기능을 중점적으로 살펴보겠습니다. 요약 제품인 FlexPivot은 기본적으로 데이터를 그룹화하여 의미 있는 집계를 계산합니다. 범위 그룹화 기능은 조건에서 정의된 범위로 문자열, 숫자, 날짜/시간 또는 기타 데이터 형식을 그룹화하는 옵션을 사용자에게 제공하여 요약과 집계를 더욱 향상시킵니다.


숫자 데이터를 100~200, 200~300 등의 범위로 그룹화할 수 있습니다. 년, 월, 분기 또는 주의 날짜 범위를 만들 수 있습니다. 알파벳 그룹화를 사용하여 문자열 값을 그룹화할 수 있습니다. 마지막으로, 범위 그룹화에서 사용자 정의 로직을 정의하여 값을 그룹화하면 모든 범위 그룹화 조건을 제어할 수 있습니다.


FlexPivot은 RangeInfo 클래스의 RangeType 속성과 RangeType 열거형을 제공하여 위 유형의 범위 그룹화를 지원합니다. 모든 API 멤버에 대한 자세한 내용은 설명서의 그룹화 주제를 참조하십시오.


범위 그룹화 기능, 기능의 필요성, C#을 사용한 구현을 이해하기 위해 실시간 시나리오로 작업해 봅시다.



사용 사례


2020년에 코로나19가 전 세계를 강타했습니다. 그 이후로 이 치명적인 바이러스에 대응하는 과정에서 이뤄진 모든 기술 발전이 시스템에 깊이 통합되었습니다.


여러 조직이 다양한 목적으로 모든 관련 데이터를 수집하고 분석했기 때문입니다. 일례로, 환자 치료에 필요한 모든 의료 리소스를 준비하기 위해 증가하거나 감소하는 확진자 수를 분석하고 있습니다.


다른 예로, 위기 상황을 원활하게 처리하기 위해 인구와 사용 가능한 리소스를 비교하고, 상황의 심각도를 파악하기 위해 사망률을 모니터링하고, 코로나19의 추가 확산을 통제하기 위해 적절한 조치를 시행하고 있습니다.


시간이 지나 코로나바이러스 백신이 개발되고 백신 접종을 위해 전 세계에 배포되면서 코로나19 데이터 분석의 차원이 한 단계 높아졌습니다. 정부와 제약 업계에서 해당 국가의 백신 접종 프로그램을 계획하고 백신 가용성을 관리하는 데 데이터 분석이 어떻게 도움이 되는지를 확인하기 위해 이 측면을 살펴보겠습니다.


신뢰할 수 있는 전 세계 리소스에서 코로나19 데이터를 수집하는 OurWorldInData에서 가져온 대량 원시 데이터에서 검색된 다음 제한된 행 집합을 확인합니다.

Image0


여기서 두 가지 데이터 형식을 관찰할 수 있습니다.


왼쪽에는 다양한 국가의 일일 백신 접종자 수가 나와 있습니다. 오른쪽에는 다양한 국가의 일일 백신 접종자 수가 연령대별로 나와 있습니다. 원시 데이터의 전체 집합을 적절하게 그룹화하고 집계할 경우 현재 전 세계 백신 접종 상황의 평가에 도움이 되는 몇 가지 질문이 아래에 나와 있습니다.


  • 전 세계 백신 접종자 수는 몇 명입니까?

  • 이 백신 접종자 수에 도달하는 데 얼마나 오래 걸렸습니까?

  • 각 국가에서 백신 접종률이 가장 높은 연령대와 가장 낮은 연령대는 무엇입니까?


위 질문에 대한 답변은 제약 회사에서 생산 계획을 세우는 데 도움이 될 수 있습니다. 그와 동시에 정부가 필요한 개수의 백신을 적시에 예약하는 데에도 유용할 수 있습니다.

이 예제는 강력한 데이터의 매우 기본적인 분석이며, 더 많은 질문에 대답할 수 있습니다.


데이터를 보기만 해도 위의 질문에 모두 대답할 수 있도록 FlexPivot과 범위 그룹화 기능을 사용하여 이 데이터를 구성하고 집계하는 방법을 살펴보겠습니다. FlexPivot으로 만든 최종 데이터 표현 보기를 빠르게 살펴보면 다음과 같으며, 위에 명시된 질문에 쉽게 대답할 수 있습니다.



첫 번째 보기: 전 세계 총 백신 접종자 수 분석


아래 스크린샷에는 2021년 8월까지 2년간 전 세계 총 백신 접종자 수가 분기별로 명확하게 나와 있습니다.

image1



두 번째 보기: 다양한 국가의 연령대별 총 백신 접종자 수 분석


다음 스크린샷은 2021년 8월까지 다양한 국가의 연령대별 백신 접종자 수를 보여 줍니다.

image2


이후 섹션에서는 FlexPivot과 범위 그룹화 기능을 사용하여 원시 데이터에서 위 데이터 표현 보기를 만드는 방법을 둘 다 설명합니다.



FlexPivot 시작하기


FlexPivot 컨트롤 작업을 시작하려면 .Net Core WPF 응용 프로그램을 만들고 NuGet 패키지 관리자로 C1.WPF.Pivot 패키지를 설치해야 합니다.


필요한 패키지를 설치하면 WPF 컨트롤이 도구 상자에 추가됩니다. WPF 응용 프로그램에 추가된 기본 창인 MainWindow.xaml에 도구 상자의 FlexPivotPage 컨트롤을 끌어서 놓습니다. 자세한 내용은 설명서의 빠른 시작 주제를 참조하십시오.


데이터에 FlexPivot 바인딩


FlexPivot 컨트롤을 데이터 표나 데이터 엔진에 바인딩하여 데이터에 바인딩할 수 있습니다. 동일한 내용을 설명하는 설명서 링크를 참조하십시오.


위 시나리오를 구현하기 위해 OurWorldInData 웹 사이트에서 관련 csv 파일을 다운로드하고 정보를 가져와 데이터베이스를 만들었습니다.


따라서 아래 코드에 설명된 대로 FlexPivot 컨트롤을 관계형 데이터베이스에 바인딩하겠습니다.

//Establish connection to database and fetch data
OleDbConnection oconn = new OleDbConnection();
oconn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=VaccinationData.mdb";
var da = new OleDbDataAdapter("select * from vaccinations", oconn);
var vaccinationSet = new DataTable();
da.Fill(vaccinationSet);              
da.SelectCommand = new OleDbCommand("select * from [vaccinations-by-age-group]", oconn);
var vaccinationSubset = new DataTable();
da.Fill(vaccinationSubset);
​
//Bind the datatable to FlexPivot's C1PivotEngine
var fpEngine = flexPivotPage1.FlexPivotPanel.C1PivotEngine;
fpEngine.DataSource = vaccinationSet.DefaultView;


FlexPivot 컨트롤을 데이터 소스에 바인딩한 후 모든 데이터 소스 필드가 FlexPivotPanel에 표시되기 시작하는 것을 관찰합니다.


FlexPivotPanel과 FlexPivot의 아키텍처를 구성하는 기타 요소를 이해하려면 설명서 링크를 참조하십시오.


아래 이미지는 FlexPivotPanel에 채워진 필드를 보여 줍니다.

image3



FlexPivotField를 추가하여 보기 만들기


이 섹션에서는 FlexPivotPage에 PivotField를 RowField, ColumnField 또는 ValueField로 추가하여 보기를 생성하는 방법을 설명합니다. 필드 설정을 적용하여 범위 그룹화 기능을 구현하는 방법도 설명합니다. 위에서 설명한 보기를 디자인하려면 여러 필드에 범위 그룹화를 적용해야 합니다. 이후 섹션에서는 각 보기에 대해 자세히 설명합니다.


PivotField를 추가하여 기본 정보 표시


첫 번째 보기에 표시할 기본 정보는 국가 이름과 각 국가의 백신 접종자 수입니다. 이 작업을 위해 location 필드를 RowField로, people_fully_vaccinated 필드를 ValueField로 추가하겠습니다.


정보가 적절한 형식으로 표시되도록 두 필드의 CaptionWidth 속성도 설정합니다. 다음은 동일한 내용을 구현하는 코드 조각입니다.

//Bind FlexPivotPage to data
fpEngine.DataSource = dt.DefaultView;
​
//Add and configure RowField
fpEngine.RowFields.Add("location");
fpEngine.RowFields[0].Caption = "Country";
​
//Add and configure ValueField
fpEngine.ValueFields.Add("people_fully_vaccinated");
fpEngine.ValueFields[0].Caption = "People fully Vaccinated";
fpEngine.ValueFields[0].Width = 200;


다음과 같은 보기가 생성되어 FlexPivotGrid에 표시됩니다.

image4


위 이미지에서 각 국가에 해당하는 데이터 항목과 특정 국가에 해당하는 모든 행의 people_fully_vaccinated 필드 값을 더한 해당 국가의 백신 접종자 수를 표시하기 위해 FlexPivot에서 원시 데이터를 요약한 방식을 관찰할 수 있습니다.


따라서 FlexPivot은 데이터 형식을 기준으로 암시적 그룹화와 집계를 구현합니다.



지역별 국가 그룹화


위에서 생성한 보기의 국가는 그룹화되지 않습니다. 이 섹션에서는 보다 요약된 형태의 데이터와 집계를 위해 범위 그룹화를 사용하여 국가를 지역으로 그룹화하는 방법을 설명합니다.


각 국가에 해당하는 지역을 저장하는 데이터베이스 필드가 있는 경우 FlexPivot에서 국가를 지역으로 그룹화할 수도 있습니다. 이 사례에서는 해당 목적에 맞는 continent 필드가 있으므로 국가와 집계를 지역별로 그룹화하는 RowField로 이 필드를 추가하기만 하면 됩니다. 다음은 동일한 내용을 구현하는 샘플 코드입니다.

//Bind FlexPivot to data
fpEngine.DataSource = dt.DefaultView;
​
//Add and configure RowField
fpEngine.RowFields.Add("continent");
fpEngine.RowFields[0].Caption = "Continent";
​
//Add and configure ValueField
fpEngine.ValueFields.Add("people_fully_vaccinated");
fpEngine.ValueFields[0].Caption = "People fully Vaccinated";
fpEngine.ValueFields[0].Width = 200;


위 코드를 실행하면 다음 보기가 생성됩니다.

image5


요약 보기를 위해 location 필드를 제거했지만 국가와 함께 지역을 표시하려는 경우 continent와 location을 둘 다 유지할 수 있습니다.


이제 각 국가에 해당하는 지역을 저장하는 필드가 없는 시나리오를 살펴봅시다. 이 시나리오에서 범위 그룹화가 사용됩니다. 사용자 정의 로직을 정의하여 국가를 지역으로 그룹화하는 사용자 정의 범위 그룹화를 사용하여 국가를 지역별로 그룹화할 수 있습니다.


이렇게 하려면 지역과 국가의 키-값 쌍을 저장하는 사전을 정의해야 합니다. 그런 다음, location RowField의 RangeType 속성을 Custom으로 설정하여 사용자 정의 범위 그룹화로 이 필드를 그룹화합니다. RangeInfo 클래스의 CustomRange 이벤트를 처리하여 각 값을 확인합니다. 사전 값과 필드 값을 비교하고 CustomRangeEventArgs 클래스의 GroupValue 속성으로 이 국가에 키, 즉 지역을 할당하여 모든 국가가 그룹화된 지역으로 렌더링되게 합니다.


아래 코드 조각은 continent 필드가 없어서 국가를 지역별로 그룹화하려면 사용자 정의 범위 그룹화가 필요한 OurWorldInData의 또 다른 데이터 집합을 사용하여 동일한 내용을 구현합니다.

//Define dictionary storing region and countries
Dictionary<string, List<string>> countries = new Dictionary<string, List<string>>(){
          {"Europe", new List<string>(){"Austria", "Belgium", "Bulgaria", "Croatia", "Cyprus", "Czechia", "Denmark", "Estonia", "Finland", "France", "Hungary", "Iceland",                    
            "Ireland", "Italy", "Latvia", "Lithuania", "Luxembourg", "Malta", "Norway", "Poland", "Portugal", "Romania", "Slovakia", "Slovenia", "Spain", "Sweden" } },
          {"South America", new List<string>(){"Peru", "Uruguay" } },
          {"USA", new List<string>(){"Jersey"} }
};
​
//Group countries by region using custom grouping
public void Custom_GroupCountryByRegion(C1PivotEngine fpEngine, DataTable dt)
{
  //Bind FlexPivot to data
  fpEngine.DataSource = dt.DefaultView;
​
  //Add and configure RowField
  fpEngine.RowFields.Add("location");
  fpEngine.RowFields[0].Caption = "Continent";
​
  //Apply custom range grouping to RowField
  fpEngine.RowFields[0].Range.RangeType = C1.PivotEngine.RangeType.Custom;
  fpEngine.RowFields[0].Range.CustomRange += Range_CustomRange;
​
  //Add and configure ValueField
  fpEngine.ValueFields.Add("people_fully_vaccinated_per_hundred");
  fpEngine.ValueFields[0].Caption = "People fully Vaccinated (per hundred)";
  fpEngine.ValueFields[0].Width = 250;
}
​
//Handle CustomRange event to perform custom grouping
private void Range_CustomRange(object sender, CustomRangeEventArgs e)
{
  foreach (var kvp in countries)
  {
    if (kvp.Value.Contains(e.Value.ToString()))
    {
        e.GroupValue = kvp.Key;
        break;
    }
  }
}


위 코드에서 어떻게 사용자 정의 그룹화를 사용하여 지역을 생성하는지 확인합니다.

image6



날짜/시간 필드에 범위 그룹화를 사용하여 보기 데이터 그룹화


이 섹션에서는 위에서 생성한 보기에 또 다른 필드인 date를 추가합니다. 앞서 제공한 원시 데이터에 표시된 대로, 국가와 age_group에 따라 달라지는 수많은 날짜별 항목이 있습니다.


따라서 이 필드를 RowField 또는 ColumnField로 추가하는 것은 의미가 없습니다. 범위 그룹화를 적용하여 날짜를 그룹화하고 의미 있는 방식으로 표시해야 합니다. 사용자 요구 사항에 따라 FiscalYear, FiscalMonth, FiscalQuarter, FiscalWeek, Quarter, Week 조건을 기준으로 날짜를 그룹화할 수 있습니다.


현재 시나리오에서는 Year 및 Quarter 그룹화를 사용하여 날짜 값을 그룹화합니다. 다음 코드 조각은 PivoFieldRangeType 속성을 적절한 값으로 설정하여 날짜 형식 값을 그룹화하는 방법을 보여 줍니다.


첫 번째 코드 조각은 날짜 값을 연도별 형식으로 그룹화합니다.

//Bind FlexPivot to data
fpEngine.DataSource = dt.DefaultView;
​
//Add and configure RowField
fpEngine.RowFields.Add("continent");
fpEngine.RowFields[0].Caption = "Continent";
​
//Add and configure ColumnField
fpEngine.ColumnFields.Add("date");
//Apply range grouping to ColumnField
fpEngine.ColumnFields[0].Format = "yyyy";
fpEngine.ColumnFields[0].Range.RangeType = RangeType.Format;
fpEngine.ColumnFields[0].Caption = "Date";
​
//Add and configure ValueField
fpEngine.ValueFields.Add("people_fully_vaccinated");
fpEngine.ValueFields[0].Caption = "People fully Vaccinated";
fpEngine.ValueFields[0].Width = 200;


위 코드 조각을 사용하여 생성된 보기를 빠르게 살펴보면 다음과 같습니다.


백신 접종자 수를 정의하는 필드가 데이터 소스의 레코드를 기준으로 두 연도로 분할되는 방식을 관찰할 수 있습니다.


image7


이제 날짜 필드의 분기별 그룹화를 구현해 봅시다.


다음은 동일한 내용을 구현하는 코드 조각입니다.

//Bind FlexPivot to data
fpEngine.DataSource = dt.DefaultView;
​
//Add and configure RowField
fpEngine.RowFields.Add("continent");
fpEngine.RowFields[0].Caption = "Continent";
​
//Add and configure ColumnField
fpEngine.ColumnFields.Add("date");
fpEngine.ColumnFields[0].Caption = "Date";
//Apply range grouping to ColumnField
fpEngine.ColumnFields[0].Range.RangeType = RangeType.FiscalQuarter;
​
//Add and configure ValueField
fpEngine.ValueFields.Add("people_fully_vaccinated");
fpEngine.ValueFields[0].Caption = "People fully Vaccinated";
fpEngine.ValueFields[0].Width = 130;


위 코드 조각을 사용하여 생성된 보기를 빠르게 살펴보면 다음과 같습니다.


백신 접종자 수를 정의하는 필드가 데이터 소스의 레코드를 기준으로 분기로 분할되는 방식을 관찰할 수 있습니다.

image8



첫 번째 보기 생성


위 섹션에서는 첫 번째 보기를 생성하기 위해 적용해야 하는 다양한 유형의 범위 그룹화에 대해 설명했습니다. 이 섹션에서는 모든 코드를 병합하여 최종 보기를 생성하는 방법을 설명합니다. 아래 코드 조각은 첫 번째 보기를 생성하는 데 사용되는 병합 코드를 보여 줍니다.

//Bind FlexPivot to data                                    
fpEngine.DataSource = vaccinationSet.DefaultView;
​
//Add and configure RowField
fpEngine.RowFields.Add("continent");
fpEngine.RowFields[0].Caption = "Continent";
​
//Add and configure ColumnFields
fpEngine.ColumnFields.Add("date");
fpEngine.ColumnFields[0].Caption = "Date";
fpEngine.ColumnFields[0].Format = "yyyy";
fpEngine.ColumnFields[0].Range.RangeType = RangeType.Format;
fpEngine.ColumnFields.Add("date");
fpEngine.ColumnFields[1].Range.RangeType = RangeType.Quarter;
​
//Add and configure ValueField
fpEngine.ValueFields.Add("people_fully_vaccinated");
fpEngine.ValueFields[0].Caption = "People fully Vaccinated";
fpEngine.ValueFields[0].Width = 100;


아래 이미지는 위 코드를 실행하면 생성되는 첫 번째 보기를 보여 줍니다.

image9



두 번째 보기 생성


FlexPivot에서는 숫자 범위 그룹화를 사용하여 숫자 데이터 범위를 만들 수 있습니다. FlexPivot을 사용하여 숫자 범위 그룹을 만드는 방법에 대한 자세한 내용은 설명서 링크를 참조하십시오.


그러나 OurWorldInData에서 가져온 데이터에는 연령대를 나타낼 숫자 범위 그룹을 포함하는 필드가 이미 있습니다. 따라서 연도/분기별로 분할된 시간 범위 내 각 국가의 백신 접종 데이터를 표시하고 백신 접종자를 연령대별로 그룹화하는 두 번째 보기를 만들기 위해 age_group 필드를 RowField로 추가하기만 하면 됩니다.


아래 코드 조각은 두 번째 보기를 생성하는 데 사용되는 코드를 보여 줍니다.

//Bind the datatable to FlexPivot's C1PivotEngine
var fpEngine = flexPivotPage1.FlexPivotPanel.C1PivotEngine;
fpEngine.DataSource = vaccinationSubset.DefaultView;
​
//Add and configure RowField
fpEngine.RowFields.Add("location");
fpEngine.RowFields[0].Caption = "Country";
fpEngine.RowFields[0].Range.CustomRange += Range_CustomRange;
fpEngine.RowFields[0].Range.RangeType = C1.PivotEngine.RangeType.Custom;
fpEngine.RowFields.Add("age_group");
fpEngine.RowFields[1].Caption = "Age Group";
​
//Add and configure ColumnFields
fpEngine.ColumnFields.Add("date");
fpEngine.ColumnFields[0].Caption = "Date";
fpEngine.ColumnFields[0].Format = "yyyy";
fpEngine.ColumnFields[0].Range.RangeType = RangeType.Format;
fpEngine.ColumnFields.Add("date");
fpEngine.ColumnFields[1].Range.RangeType = RangeType.FiscalQuarter;
​
//Add and configure ValueField
fpEngine.ValueFields.Add("people_fully_vaccinated_per_hundred");
fpEngine.ValueFields[0].Caption = "People fully Vaccinated (per hundred)";
fpEngine.ValueFields[0].Width = 100;


아래 이미지는 위 코드를 실행하면 생성되는 두 번째 보기를 보여 줍니다.

image10


위에서 설명한 모든 범위 그룹화 시나리오를 구현하는 샘플을 여기서 또는 위의 첨부파일을 다운로드합니다.





지금 바로 ComponentOne을 다운로드하여 직접 테스트해보세요!

 
  • 페이스북으로 공유
  • 트위터로  공유
  • 링크 복사
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

태그1

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@mescius.com | 전화 : 1670-0583 | 경기도 과천시 과천대로 7길 33, 디테크타워 B동 1107호 메시어스(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 ⓒ 2024 MESCIUS inc. All rights reserved.