Power Query가 null 값을 포함하는 열의 합계를 어떻게 처리합니까?
10529 단어 PowerBIExcelPowerQuery
그리고, 알기 쉬운 곳에서, 열의 값을 더해 열을 추가하는 스타일로. (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
발행되는 SQLselect [_].[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를 사용하는 것을 좋아하지 않을 뿐입니다.
기타
let
Source = Table1,
InsertedSum = Table.AddColumn(
Source,
"Addition",
each
List.Sum(
{[Column1], [Column2], [Column3]}
),
Int64.Type
)
in
InsertedSum
let
Source = Table1,
InsertedSum = Table.AddColumn(
Source,
"Addition",
each
List.Sum(
{[Column1], [Column2], [Column3]} & {0}
),
Int64.Type
)
in
InsertedSum
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
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 [_]
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를 사용하는 것을 좋아하지 않을 뿐입니다.
기타
Reference
이 문제에 관하여(Power Query가 null 값을 포함하는 열의 합계를 어떻게 처리합니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/PowerBIxyz/items/ee002f4aa0358f26a6a2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)