C1 DataEngine 활용한 피벗(Pivot) 변환 > 블로그 & Tips

본문 바로가기

ComponentOne

블로그 & Tips

C1 DataEngine 활용한 피벗(Pivot) 변환

페이지 정보

작성자 GrapeCity 작성일 21-05-27 14:29 조회 2,698회 댓글 0건

본문

데이터는 21세기의 새로운 연료이고, 매일 생성되는 데이터의 양은 엄청나므로, 이러한 데이터를 심층 분석하면 중요한 정보를 얻을 수 있습니다.


데이터를 사용하면 특정 기간의 매출 또는 가장 많이 팔린 제품 등 회사에 대한 많은 내용을 파악할 수 있습니다. 이러한 분석을 통해 판매 예측, 계획, 마케팅, 기타 비즈니스 활동에 대한 의사 결정 시 도움을 받을 수 있습니다.


전통적으로 데이터는 표 형식으로 저장되는데, 여기서 각 행은 데이터의 단일 항목을 나타냅니다. 일반적으로 원시 데이터는 매우 크고 구조가 복잡하며 그다지 유용하지 않기 때문에 무엇을 나타내는지 쉽게 확인할 수 있는 요약된 형식으로 표시해야 합니다.


예를 들어, 자동차 판매 회사에서 어떤 주에서 자동차 판매랑이 가장 많은지에 대한 정보를 수집해야 한다고 가정해 보겠습니다. 이 경우에는 행별로 데이터 행을 살펴보는 대신 각 주별 판매량을 집계하는 것이 더 좋습니다. 이러한 유형의 요약/집계를 피벗 변환이라고 합니다. 집계 이외에 피벗 변환은 여러 데이터 집합을 정렬, 필터링, 그룹화할 수 있습니다.


ComponentOne의 C1DataEngine 및 C1FlexPivotEngine은 큰 데이터 집합에 피벗 변환을 적용하는 데 사용할 수 있습니다. C1DataEngine은 큰 데이터 집합에서 데이터를 쿼리하는 데 열 지향적 및 메모리 매핑 파일 기법 등과 같은 최적화 기법을 적용하여 빠른 데이터 분석을 제공합니다. C1FlexPivotEngine을 사용하여 결과 데이터에 대한 피벗을 생성할 수 있습니다.


쿼리한 데이터는 여러 가지 다른 변환 형식으로 표시할 수 있습니다. 열/행 필드는 요구 사항 기준으로 기타 필드에 따라 그룹화할 수 있습니다. 이렇게 하면 비즈니스 요구 사항에 따라 수백만 개의 데이터를 변환할 수 있습니다. C1DataEngine의 데이터는 SQL 데이터베이스, JSON 파일, CSV 파일 등 여러 소스에서 가져올 수 있고 C1FlexPivotEngine은 C1DataEngine에 쉽게 연결할 수 있습니다.


이제 C1DataEngine을 사용하여 데이터에 다양한 피벗 변환을 적용하는 방법을 자세히 살펴보겠습니다.


프로젝트에서 C1DataEngine 사용


C1DataEngine은 .NET 프로젝트에 쉽게 통합할 수 있습니다. C1DataEngine에는 다음 NuGet 패키지가 필요합니다.


  • C1.DataEngine.Core

  • C1.DataEngine.Core.Api


C1DataEngine은 Workspace 클래스를 사용하여 초기화됩니다. 이 클래스의 개체가 생성될 때 프로젝트 디렉터리에 폴더가 생성되는데, 이 폴더에는 메타데이터, 테이블, 쿼리, 쿼리 결과가 모두 포함되어 있습니다. Workspace 클래스의 Init 메서드가 작업 영역을 초기화하거나 작업 영역(없는 경우)을 새로 만드는 데 사용됩니다.

this._workSpace = new Workspace();  
this._workSpace.Init("workspace");  


이렇게 하면 workspace 작업 영역을 초기화합니다. 이제 이 작업 영역을 데이터 소스에 연결해야 합니다. 이 문서에서는 SQL 데이터베이스를 사용합니다.

SqlConnection conn = new SqlConnection(GetConnectionString());  
conn.Open();  
var command = new SqlCommand("Select * from Invoices", conn);  
Now a connection is created, the DbConnector class can be used to connect this SqlConnection to this workspace:  
var connector = new DbConnector(this._workSpace, conn, command);  
connector.GetData("Invoices");  
this.invoice = this._workSpace.table("Invoices");



쿼리에 대한 피벗


작업 영역과 데이터 소스가 초기화되었으므로 이제 Invoices 테이블에서 데이터 엔진을 쿼리할 수 있습니다. 다음으로, 이 데이터 엔진을 C1FlexPivotEngine에 연결합니다.


초기화하려면 C1FlexPivotEngine에는 테이블 또는 쿼리 이름이 필요합니다. 따라서 데이터 엔진에 대해 먼저 쿼리를 실행한 다음 쿼리에 따라 초기화된 C1FlexPivotEngine의 인스턴스를 반환하는 제네릭 메서드를 만들 수 있습니다.

C1FlexPivotEngine CreateFlexPivotEngine(string queryName, string[] colFields, string[] rowFields, string[] valFields)  
{  
          var fp = new C1FlexPivotEngine();  
          fp.Workspace = this._workSpace;  
          fp.ConnectDataEngine(queryName);  
          fp.BeginUpdate();  
          fp.ColumnFields.Add(colFields);  
          fp.RowFields.Add(rowFields);  
          fp.ValueFields.Add(valFields);  
          fp.TotalsBeforeData = true;  
          fp.EndUpdate();  
          return fp;  
}  


여기서 queryName 매개 변수는 쿼리 이름(나중에 설명함) 또는 테이블 이름입니다. RowFields 및 ColumnFields는 엔진이 데이터를 그룹화하는 데 사용하는 차원 필드입니다. ValueField는 집계가 적용되는 측정값 필드로, 일반적으로 숫자 필드입니다.


C1FlexPivotEngine은 작업 영역을 제공한 다음 쿼리 이름을 사용하여 데이터 엔진에 연결되어 초기화됩니다. 유연한 피벗 엔진이 생성되면 FlexPivotDefaultView 속성을 사용하여 변환된 데이터를 가져올 수 있습니다.


DataEngine은 한 번만 쿼리하고 집계와 함께 필요한 모든 열을 가져옵니다. 그런 다음 C1FlexPivotEngine을 사용하여 단일 쿼리 결과에 다른 변환을 적용할 수 있습니다. DataEngine에서는 Workspace 클래스의 쿼리 메서드를 사용할 수 있습니다.


이 쿼리 메서드는 이 이름을 사용하여 결과를 저장하는 선택적 이름 매개 변수를 사용하기 때문에 나중에 이 매개 변수를 사용할 수 있습니다(CreateFlexPivotEngine 메서드의 queryName 매개 변수). 두 번째 매개 변수가 중요합니다. 여기서 데이터를 쿼리하는 방법에 대한 정보를 제공할 수 있습니다.

var queryName = this.QueryName;  
var settings = new  
{  
              invoice.Country,  
              invoice.ProductName,  
              invoice.Salesperson,  
              invoice.OrderDate,  
              Sales = Op.Sum(invoice.ExtendedPrice),  
              Quantity = Op.Count(invoice.Quantity),  
              QuantityTotal = Op.Sum(invoice.Quantity)  
};  
dynamic query = GetQuery(queryName, settings);  
query.Query.Execute();  


쿼리가 실행되면 나중에 사용할 수 있도록 결과가 작업 영역 폴더에 저장됩니다.



단일 열 피벗 변환


단일 열 피벗 변환에서 변환은 단일 열에만 적용됩니다. 즉, 단일 열만을 기준으로 데이터가 집계됩니다.


국가별 매출을 알아야 하는 경우 Invoices 테이블에서 데이터를 국가별로 그룹화하고 각 국가의 매출을 모두 더하는 단일 열 피벗 변환을 적용할 수 있습니다.

var fp = this.CreateFlexPivotEngine(this.QueryName, new string[] { "" }, new string[] { "Country" }, new string[] { "Sales" });  
IBindingList data = fp.FlexPivotDefaultView;


데이터는 필드에 따라 변환됩니다. Country 열은 행 필드로 추가되었기 때문에 열에 표시되고 국가별로 집계된 매출 데이터는 다른 열에 각 국가와 나란히 표시됩니다.


SalesbyCountry


또한 단일 열 변환을 사용하여 단일 제품의 판매 수량도 확인할 수 있습니다.


판매 수량을 확인하기 위해 Product 열에서 데이터를 그룹화하고 Quantity 열에서 집계를 적용할 수 있습니다.


var fp = this.CreateFlexPivotEngine(this.QueryName, new string[] { "" }, new string[] { "ProductName" }, new string[] { "Quantity" });  
IBindingList data = fp.FlexPivotDefaultView;  


ProductQuantitySold


다중 열 피벗 변환


이름으로 알 수 있듯이 다중 열 피벗 변환은 데이터가 여러 열로 그룹화되는 피벗 변환 유형입니다. 최상위 열이 먼저 그룹화된 다음 그 아래 수준 열이 그룹화되는 식입니다.


예를 들어, 국가별 총 매출 이외에 특정 국가 내에서 제품별 총 매출을 알고 싶은 경우,

국가를 최상위 열, 제품을 그다음 열, 각 항목에 대한 매출 합계를 그다음 열로 지정하고 다중 열 피벗 변환을 적용할 수 있습니다.

var fp = this.CreateFlexPivotEngine(this.QueryName, new string[] { "Country" }, new string[] { "ProductName" }, new string[] { "Sales" });  
IBindingList data = fp.FlexPivotDefaultView;  


결과 데이터에는 개별 제품에 해당하는 열이 나온 후 각 국가의 집계된 매출이 여러 열에 포함됩니다. 국가의 개별 값에는 매출 열이 있습니다.

ProductSalesbyCountry


또한 더 깊은 수준의 열에 대해서도 변환을 적용할 수 있습니다.


판매를 성사시킨 사람의 이름에 해당하는 열을 추가하면 다음 3개 열에 대해 변환이 적용됩니다.

var fp = this.CreateFlexPivotEngine(this.QueryName, new string[] { "Country" }, new string[] { "ProductName", "Salesperson" }, new string[] { "Quantity" });  
IBindingList data = fp.FlexPivotDefaultView;  


QuantitySoldbyPerson



DateTime 열에서 범위 기준 그룹화


회사의 거의 모든 데이터 집합에는 날짜 열이 있습니다. 날짜 유형 열에 대해서도 피벗 변환을 수행할 수 있습니다.


일반적으로, 데이터 집합이 너무 크고 아주 오래된 데이터가 포함될 수도 있기 때문에 모든 단일 날짜에 대해 데이터를 그룹화하는 것은 가능하지 않습니다.


따라서 C1FlexPivotEngine을 사용하여 연도 또는 월 등과 같은 단일 속성을 기준으로 날짜를 집계할 수 있습니다.


이렇게 하면 반환되는 항목 수를 크게 줄이고 데이터에 대한 보다 정확한 정보를 제공할 수 있습니다.


예를 들어, 특정 연도의 총 매출을 확인할 수 있습니다. 이를 위해 피벗 필드의 Format 및 RangeType 속성을 사용합니다.

var fp = this.CreateFlexPivotEngine(this.QueryName, new string[] { }, new string[] { "OrderDate" }, new string[] { "Sales" });  
var fld = fp.RowFields[0];  
fld.Range.RangeType = RangeType.Format;  
fld.Format = "yyyy";  
IBindingList data = fp.FlexPivotDefaultView;  


SalesGroupbyYear


여기서 다중 열 변환을 수행할 수도 있습니다. 위에서 얻은 매출 값을 연도와 월로 구분하려 한다고 가정해 보십시오. 그러면 OrderDate에 해당하는 행 필드를 2개 추가하고 각 필드의 형식을 변경합니다.

var fp = this.CreateFlexPivotEngine(this.QueryName, new string[] { }, new string[] { "OrderDate", "OrderDate" }, new string[] { "QuantityTotal" });  
var year = fp.RowFields[0];  
year.Range.RangeType = RangeType.Format;  
year.Format = "yyyy";
var month = fp.RowFields[1];  
month.Range.RangeType = RangeType.Format;  
month.Format = "MMM";  
month.Caption = "Month";  
IBindingList data = fp.FlexPivotDefaultView;  


ProductsSoldInYearMonthly

기타 작업

데이터 변환 외에 C1DataEngine은 정렬 및 필터링 같은 다른 작업을 수행할 수 있습니다. 이러한 작업을 어떻게 수행할 수 있는지 간단히 살펴보겠습니다.

정렬

C1DataEngine 패키지는 Sort라고 하는 정적 메서드가 있는 DataList 클래스를 노출합니다. 이 메서드는 IDataList, 열 이름, 선택적 오름차순 매개 변수를 사용하여 열 이름에 따라 오름차순으로 목록을 정렬합니다. SalesByCountry 쿼리에서 Sales 열에 내림차순 정렬을 적용해 보겠습니다.

var result = this._workSpace.GetQueryData("SalesByCountry");  
DataList.Sort(result, "Sales", false); // sort result in descending order by sales column  

쿼리 개체를 만들지 않고 GetQueryData 메서드를 어떻게 직접 사용했는지 보셨지요.

그 이유는 SalesByCountry 쿼리를 실행하면 데이터 엔진이 결과를 작업 영역 폴더에 저장하므로 데이터베이스를 다시 쿼리하지 않아도 응용 프로그램을 다시 시작한 후 저장된 결과를 다시 사용할 수 있기 때문입니다.

SortedSalesbyCountry


필터링

필터링은 C1FlexPivotField 개체의 Filter 속성으로 노출되는 C1FlexPivotFitler 클래스를 사용하여 수행할 수 있습니다.

이 클래스에는 여러 필터 유형을 결합하기 위한 속성이 많이 포함되어 있습니다. 예를 들어, 국가 중 브라질만 표시하도록 ProductSalesByCountry를 필터링할 수 있습니다.

var fp = this.CreateFlexPivotEngine(this.QueryName, new string[] { }, new string[] { "Country", "ProductName" }, new string[] { "Sales" });  
var fld = fp.RowFields[0].Filter;  
fld.Condition1.Operator = ConditionOperator.Equals;  
fld.Condition1.Parameter = "Brazil";  
IBindingList data = fp.FlexPivotDefaultView;  


FilterEsalesByCountry


또한 위 쿼리에서 Equals 연산자 대신 NotEqualsTo 연산자를 사용하여 브라질을 제외한 다른 모든 국가를 표시할 수도 있습니다.

var fp = this.CreateFlexPivotEngine(this.QueryName, new string[] { }, new string[] { "Country", "ProductName" }, new string[] { "Sales" });  
var fld = fp.RowFields[0].Filter;  
fld.Condition1.Operator = ConditionOperator.NotEquals;  
fld.Condition1.Parameter = "Brazil";  
IBindingList data = fp.FlexPivotDefaultView;  


FilterNESalesByCountry


또한 여러 연산자를 결합하여 복합 필터링을 수행할 수도 있습니다.


예를 들어, 매출이 200보다 작고 100보다 큰 항목만 집계하려는 경우 AndConditions 속성과 함께 GreaterThanOrEqualTo 및 LessThanOrEqualTo 연산자를 결합하여 사용할 수 있습니다.

var fp = this.CreateFlexPivotEngine(this.QueryName, new string[] { }, new string[] { "Country" }, new string[] { "Sales" });  
var fld = fp.ValueFields[0].Filter;  
fld.Condition1.Operator = ConditionOperator.GreaterThanOrEqualTo;  
fld.Condition1.Parameter = 100;  
fld.Condition2.Operator = ConditionOperator.LessThanOrEqualTo;  
fld.Condition2.Parameter = 200;  
fld.AndConditions = true;  
IBindingList data = fp.FlexPivotDefaultView;  


FilterSalesbyCountry


이 문서에서는 피벗 변환에 C1DataEngine 및 C1FlexPivotEngine을 사용하는 방법을 간단하게 살펴보았습니다.


그러나 이 내용은 빙산의 일각에 불과합니다. 변환, 정렬 등에 대한 자세한 설명은 문서 링크에 나와 있습니다. C1DataEngine 작업에 대해 자세히 알아보려면 블로그 링크의 내용을 참조할 수 있습니다.


이 블로그에서는 C1DataEngine의 각 컴포넌트와 C1DataEngine의 명령줄 도구 사용 방법에 대해 자세히 설명합니다.


  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

그레이프시티 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

태그

인기글

더보기
  • 인기 게시물이 없습니다.
그레이프시티 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@grapecity.com | 전화 : 1670-0583 | 경기도 안양시 동안구 시민대로 230, B-703(관양동, 아크로타워) 그레이프시티(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 Copyright ⓒ 2022 GrapeCity inc.