programing

다른 열을 기준으로 열을 변환하는 파워 쿼리

topblog 2023. 9. 25. 22:10
반응형

다른 열을 기준으로 열을 변환하는 파워 쿼리

나는 이것이 쉬울 것이라고 계속 생각하지만 답은 나를 회피하고 있습니다.Excel Power Query에서는 다른 열의 값을 기준으로 열의 각 행의 값을 변환하고자 합니다.예를 들어, 다음과 같이 표 1을 가지고 있다고 가정합니다.

Column A | Column B
-------------------
X        | 1
Y        | 2

새 열을 추가하고 원래 열 A를 대체할 필요 없이 열 B의 값을 기준으로 열 A의 값을 변환하고 싶습니다.TransformColumns를 사용해 보았지만 입력은 대상 열의 값만 될 수 있습니다. TransformColumns 함수 내에서 행/기록의 다른 필드 값에 액세스할 수 없습니다.저는 다음과 같은 일을 하고 싶습니다.

=Table.TransformColumns(Table1, {"Column A", each if [Column B]=1 then "Z" else _ })

결과는 다음과 같습니다.

Column A | Column B
-------------------
Z        | 1
Y        | 2

이를 위한 방법이 있다는 것을 알고 있지만 단계/변환을 최소화하는 방법을 찾고 있습니다.예를 들어, 저는 테이블을 사용할 수 있다는 것을 알고 있습니다. B를 보는 함수를 기반으로 새로운 열 A를 추가하기 위해 열을 추가하지만, 원래의 열 A를 제거하고 여러 단계를 추가해야 하는 새로운 열 A로 대체해야 합니다.

제가 이렇게 하게 된 계기는 다음과 같습니다.

Table1:
Column A | Column B
-------------------
X        | 1
Y        | 2

= Table.FromRecords(Table.TransformRows(Table1,
    (r) => Record.TransformFields(r,
        {"A", each if r[Column B]="1" then "Z" else _})))

결과:

Column A | Column B
-------------------
Z        | 1
Y        | 2

이렇게 하면 레코드에서 중첩된 목록을 사용하여 여러 열을 한 번에 변환할 수 있습니다.TransformFields 함수.

또 다른 대안은 다음과 같습니다.

= 테이블.Replace Value(표 1, 각 [열 A], 각 [열 B]=1인 경우 "Z", 다른 [열 A] , Replacer.텍스트 바꾸기, {"열 A"})

코드는 읽기 쉽지만 한 번에 하나의 열에만 적용할 수 있습니다.

대부분 여기에 나와 있는 것처럼 UI를 사용하여 생성할 수 있습니다. http://www.thebiccountant.com/2017/07/23/transforming-a-column-with-values-from-another-column-in-powerbi-and-powerquery-in-excel/

로건에게 경의를 표합니다.스노우에이터...대답 너무 좋아요.여러 작업에 대해 확장할 수 있다고 말씀하셨고 이를 성공적으로 사용한 예를 게시하고 싶었습니다.

#"Patch Records" = Table.FromRecords(Table.TransformRows(#"Sorted Rows",
(r) => Record.TransformFields( r, {
    {"Min Commit", each 
        if r[service_id] = "21430" then 81 else
        if r[service_id] = "24000" then 230 else
        if r[service_id] = "24008" then 18 else
        if r[service_id] = "24009" then 46.9 else
        _},
    {"Installed", each 
        if r[service_id] = "21430" then 90 else
        if r[service_id] = "24000" then 230 else
        if r[service_id] = "24008" then 18 else
        if r[service_id] = "24009" then 52 else
        _},
    {"Requested", each 
        if r[service_id] = "21430" then 90 else
        if r[service_id] = "24000" then 230 else
        if r[service_id] = "24008" then 18 else
        if r[service_id] = "24009" then 52 else
        _}})))

제가 유일하게 놀란 것은 모든 데이터 유형을 완료한 후 다시 설정해야 한다는 것이었습니다. 하지만 돌이켜보면 그럴 만도 합니다.

p.s. 나는 이것을 해결책에 대한 의견으로 게시하기에 충분한 평판 포인트가 없었습니다.

로건을 기반으로 하는SnowEater의 답은 표의 두 번째 인수를 사용하여 표 열 유형을 유지하는 한 가지 방법입니다.M 참조에 지정된 레코드에서:

Table1:
Column A | Column B
-------------------
    X    |    1
    Y    |    2

편집: 값을 사용하여 테이블에서 테이블 유형을 추출하는 훨씬 더 나은 방법을 사용하도록 업데이트되었습니다.입력 - 또한 여러 열을 한 번에 수정하여 완성도를 높입니다.가치에 대한 훌륭한 대화 덕분입니다.유형: https://social.technet.microsoft.com/Forums/en-US/636e9b44-6820-4ff2-ab60-5dd6a5307bd2/type-conversion-mysteries

=Table.FromRecords(
    Table.TransformRows(
        Table1,
        (r) => 
        Record.TransformFields(
            r,
            {
                {"Column A", each if r[Column B]="1" then "Z" else _},
                {"Column B", each if r[Column A]="Y" then "99" else _}
            }
        )
    ),
    Value.Type(Table1)
)

공식을 잘 편집하지 못해서 죄송합니다. 이제 효과가 있습니다.

= Table.ReplaceValue(   #"Removed Columns", 
                   each [Contract Start Date],
                    each if [Contract Start Date] < #date(2019,01,01) then #date(2019,01,01) else
                          [Contract Start Date]
                    ,Replacer.ReplaceValue,
                    {"Contract Start Date"})

이러한 단계로는 기존 열을 변환할 수 없습니다.새 열을 사용하고 변환한 다음 기존 열을 삭제합니다.뭐가 그리 대단한 일입니까?Excel에서는 공식이 다른 열의 값을 변경하는 것을 기대할 수 없습니다.검정력 쿼리에서는 수식의 결과도 열에 저장되며, 이 열은 수식 입력 값 중 하나를 제공하는 열이 될 수 없습니다.

언급URL : https://stackoverflow.com/questions/31548135/power-query-transform-a-column-based-on-another-column

반응형