# 그룹화 내 정렬

## Content

테이블 시트는 그룹 열과 기본 열 간의 정렬이 작동하는 그룹화 내 정렬을 지원합니다.
아래 이미지는 그룹화 결과를 기반으로 정렬된 결과를 보여주며, “Selling Package” 그룹 열은 오름차순이고 “Year Quarter” 그룹 열과 “Stock Item Key” 기본 열은 내림차순으로 정렬되어 있습니다.
![](https://gcdocumentsitekrblob.blob.core.windows.net/document-site-files/images/8d606653-16a0-474d-b9dc-e2b4d01c2446/images/ts-grouping-sort.png)

테이블 시트 그룹화에서 정렬을 사용할 때 다음과 같은 동작이 발생합니다:

* 그룹 열과 해당 원본 열 간에 정렬 상태가 공유됩니다.
<br>
    ![](https://gcdocumentsitekrblob.blob.core.windows.net/document-site-files/images/8d606653-16a0-474d-b9dc-e2b4d01c2446/images/ts-grouping-sortsame.png)
<br>
* 그룹 수준에서는 오직 하나의 열만 정렬할 수 있습니다.
<br>
    ![](https://gcdocumentsitekrblob.blob.core.windows.net/document-site-files/images/8d606653-16a0-474d-b9dc-e2b4d01c2446/images/ts-grouping-sortsingle.gif)
<br>
* `groupBy`를 적용하기 전의 마지막 정렬 상태와 `removeGroupBy`를 적용한 후의 마지막 정렬 상태가 유지됩니다.

![](https://gcdocumentsitekrblob.blob.core.windows.net/document-site-files/images/8d606653-16a0-474d-b9dc-e2b4d01c2446/images/ts-grouping-sortstatus.gif)

반면, 필터링은 사용자가 선택한 기준에 따라 관련된 데이터만 표시할 수 있도록 합니다. 기본적으로 그룹화에서는 자동 필터가 활성화되어 있습니다.
![Filter_TSGrouping.b2fd90.png](https://gcdocumentsitekrblob.blob.core.windows.net/document-site-files/images/216c2e7e-5246-4c37-8843-3854aa344a6a/Filter_TSGrouping.b2fd90.43e52e.png?width=700)
그룹화된 열에서 필터링을 비활성화하려면 `allowFilterByValue` 및 `allowFilterByList` 속성을 false로 설정합니다.다음 샘플 코드는 그룹화된 컨텍스트에서 정렬과 필터링을 비활성화하는 예제입니다. 이는 `allowSort`, `allowFilterByValue`, `allowFilterByList` 속성을 false로 설정하여 구현됩니다. 이러한 설정을 통해 사용자는 정렬/필터 대화 상자에 접근할 수 없게 되며, 그룹화된 데이터에서 어떠한 정렬이나 필터링 작업도 수행할 수 없게 됩니다.

```javascript
var spread, sheet;
$(document).ready(function () {
    // Spread 초기화
    spread = new GC.Spread.Sheets.Workbook(document.getElementById('ss'), { sheetCount: 0 });
    spread.options.autoFitType = GC.Spread.Sheets.AutoFitType.cellWithHeader;

    // 데이터 매니저 초기화
    var dataManager = spread.dataManager();
    var myTable = dataManager.addTable("myTable", {
        remote: {
            read: {
                url: 'https://demodata.grapecity.com/wwi/api/v1/stockItems'
            }
        },
        schema: {
            columns: {
                validFrom: { dataType: "date" }
            }
        }
    });

    // 테이블 시트 초기화
    sheet = spread.addSheetTab(0, "TableSheet1", GC.Spread.Sheets.SheetType.tableSheet);

    // 테이블 시트에 뷰 바인딩
    myTable.fetch().then(function () {
        var view = myTable.addView("myView", [
            { value: "stockItemKey", width: 150, caption: "Stock Item Key" },
            { value: "stockItem", width: 120, caption: "Stock Item" },
            { value: "buyingPackage", width: 120, caption: "Buying Package" },
            { value: "sellingPackage", width: 120, caption: "Selling Package" },
            { value: "unitPrice", width: 150, caption: "Unit Price" },
            { value: "taxRate", width: 120, caption: "Tax Rate" },
            { value: "validFrom", width: 200, caption: "Valid From" }
        ]);
        sheet.setDataView(view);

    });
});

function grouping() {
    // 단일 필드(Selling package)로 groupBy 생성, 요약 필드 및 슬라이스 필드 포함
    sheet.groupBy([
        {
            caption: "Selling Package", field: "sellingPackage", width: 150, style: { backColor: "#F9CA9A" },
            allowSort: false,
            allowFilterByValue: false,
            allowFilterByList: false,
            summaryFields: [
                {
                    caption: "SUM(Unit Price)",
                    formula: "=SUM([unitPrice])",
                    slice: { field: "=YEAR([@validFrom])", width: 120, style: { backColor: "#FCE3CA", formatter: "#,##0.00" } },
                    width: 150,
                    style: { backColor: "#FAD7B2", formatter: "#,##0.00" }
                }
            ]
        }
    ]);
}

function removeGroup() {
    // 그룹 제거
    sheet.removeGroupBy();
}
```