Power Query가 null 값을 포함하는 열의 합계를 어떻게 처리합니까?

10529 단어 PowerBIExcelPowerQuery
if then else 로 어떻게든 하는 분은 많이 볼 수 있습니다. 필요하다면 어쩔 수 없지만 다른 방법을 모르는 것은 좋지 않다고는 생각합니다. 예를 들어, null 값을 사칙 연산의 해는 평가 불능이 아닌 한 null 가 되어 버리므로, if [Column1] = null then 0 else [Column1] 라는 상태에 열 마다 대처 등하고 있는 것입니다. 계산의 대상이 되는 열이 적으면 좋지만, 많아지거나 열명이 바뀌거나 했을 때 힘들지? 그리고. Power Query와 에디터의 기능은 향상되어 있어 이전에 할 수 없었던 것이 은근하게 할 수 있게 되어 있는 경우도 많습니다.

그리고, 알기 쉬운 곳에서, 열의 값을 더해 열을 추가하는 스타일로. (Table.AddColumn)

무슨 일이야



Column1에서 Column3의 합을 열로 추가합니다. 그 때 null 는 0 으로서.


어떻게 할까



집계할 열을 두 개 이상 선택하고 [열 추가] - [통계] - [합계] 또는 [열 추가] - [표준] - [더하기]. 열이 2개인 경우는 합계를 사용한다.

뭐! 간단! 전부는 아니지만 충분할지도 모른다.


생성된 스크립트
let
    Source = Table1,
    InsertedSum = Table.AddColumn(
        Source,
        "Addition",
        each
            List.Sum(
                {[Column1], [Column2], [Column3]}
            ),
        Int64.Type
    )
in
    InsertedSum

포인트는 [Column1] + [Column2] + [Column3] 대신 List.Sum이 사용됩니다.

List.Sum
리스트 list 내의 NULL 이외의 값의 합계를 돌려줍니다. 리스트에 NULL 이외의 값이 없는 경우, NULL 를 돌려줍니다.

원래 null 치를 무시한 합을 돌려주기 때문에 이 케이스에서도 매치 하는 것입니다.

어떻게 할까, 더



대상의 열이 모두 null 치가 되는 경우도.

대응시킨 스크립트
let
    Source = Table1,
    InsertedSum = Table.AddColumn(
        Source,
        "Addition",
        each
            List.Sum(
                {[Column1], [Column2], [Column3]} & {0}
            ),
        Int64.Type
    )
in
    InsertedSum

List.Sum 의 인수의 리스트가 모두 null 가 아니면 되므로 리스트 아이템이 0 의 리스트를 추가하면 된다.

쿼리 폴딩을 유지할 수 있습니까?



Azure SQL database에서 시도해 보았습니다.
List.Sum 의 인수의 list 에 리스트 아이템을 추가하는 방법은 쿼리 폴딩이 유효하지 않게 되므로, 값 0 의 열을 일시적으로 추가해 집계 대상에 0 을 추가하는 느낌으로.
뷰를 고쳐 받는 것이 좋지만, 아무래도 하는 것이라면 쿼리 폴딩을 유지할 수도 있다.
    Source = Sql.Databases("****.database.windows.net"),
    ***** = Source{[Name="****"]}[Data],
    dbo_TEST1 = ****{[Schema="dbo",Item="TEST1"]}[Data],
// 0 の列を追加
    AddedCustomColumn = Table.AddColumn(
        dbo_TEST1,
        "AddedZero",
        each 0, 
        Int64.Type
    ),
    InsertedSum = Table.AddColumn(
        AddedCustomColumn,
        "Addition",
        each 
            List.Sum(
                {[Column1], [Column2], [Column3], [AddedZero]}
            ),
        Int64.Type
    ),
    RemovedOtherColumns = Table.SelectColumns(
        InsertedSum,
        {"Column1", "Column2", "Column3", "Addition"}
    )
in
    RemovedOtherColumns

발행되는 SQL
select [_].[Column1] as [Column1],
    [_].[Column2] as [Column2],
    [_].[Column3] as [Column3],
    case
        when (([_].[Column1] is null and [_].[Column2] is null) and [_].[Column3] is null) and [_].[AddedZero] is null
        then null
        else (((case
            when [_].[Column1] is null
            then 0
            else [_].[Column1]
        end) + (case
            when [_].[Column2] is null
            then 0
            else [_].[Column2]
        end)) + (case
            when [_].[Column3] is null
            then 0
            else [_].[Column3]
        end)) + (case
            when [_].[AddedZero] is null
            then 0
            else [_].[AddedZero]
        end)
    end as [Addition]
from 
(
    select [_].[Column1] as [Column1],
        [_].[Column2] as [Column2],
        [_].[Column3] as [Column3],
        0 as [AddedZero]
    from 
    (
        select [Column1],
            [Column2],
            [Column3]
        from [dbo].[TEST1] as [$Table]
    ) as [_]
) as [_]

열 이름에 의존하지 않는 방법



그 시점에서 모든 열을 대상으로 해 버리지만, 행은 record 로서 참조할 수 있으므로.

Record.FieldValues
레코드 record의 필드 값 목록을 반환합니다.
let
    Source = Table1,
    InsertedSum = Table.AddColumn(
        Source,
        "Addition",
        each
            List.Sum(
                Record.FieldValues(_) & {0} // ← ココ
            ),
        Int64.Type
    )
in
    InsertedSum

생각했어요🙄



table 을 다루는 함수는 사용 기회도 많고 비교적 빨리 기억할 수 있을 것입니다. 다만, 그것만으로는 할 수 없거나 번거롭거나 하는 것이 생각 외에 많이 존재하는 것은 아닐까. 그래서 list와 record를 다루는 함수도 똑같이 이해해 두면 행복해질 수 있을지도 모른다. 적어도, 사용도는 모르더라도 어떠한 처리를 할 수 있는 함수가 갖추어져 있는지 바라보는 것만으로도일까.

원래 Power Query에서 if then else를 사용하는 것을 좋아하지 않을 뿐입니다.

기타


  • Power BI 스터디 - connpass
  • Power BI Desktop을 사용하려면
  • Excel에서 Power Query를 사용하려면
  • 좋은 웹페이지 즐겨찾기