PowerQuery PowerBI根据StartDate和EndDate之间的条件合并2个表

PowerQuery PowerBI根据StartDate和EndDate之间的条件合并2个表,powerbi,powerquery,Powerbi,Powerquery,我尝试使用Power Query/PowerBI:INVICE和dimDate连接两个表,以创建以下结果表: +------------+--------------+--------------+-----------+-----------+ | EmployeeId | EmployeeName | AbsenceType | StartDate | EndDate | +------------+--------------+--------------+-----------+-

我尝试使用Power Query/PowerBI:INVICE和dimDate连接两个表,以创建以下结果表:

+------------+--------------+--------------+-----------+-----------+
| EmployeeId | EmployeeName | AbsenceType  | StartDate |  EndDate  |
+------------+--------------+--------------+-----------+-----------+
|          1 | A            | Annual Leave | 2/01/2017 | 5/01/2017 |
|          2 | B            | Sick Leave   | 4/01/2017 | 6/01/2017 |
+------------+--------------+--------------+-----------+-----------+
缺勤表

+------------+--------------+--------------+-----------+-----------+
| EmployeeId | EmployeeName | AbsenceType  | StartDate |  EndDate  |
+------------+--------------+--------------+-----------+-----------+
|          1 | A            | Annual Leave | 2/01/2017 | 5/01/2017 |
|          2 | B            | Sick Leave   | 4/01/2017 | 6/01/2017 |
+------------+--------------+--------------+-----------+-----------+
dimDate表

+------------+--------------+--------------+-----------+-----------+
| EmployeeId | EmployeeName | AbsenceType  | StartDate |  EndDate  |
+------------+--------------+--------------+-----------+-----------+
|          1 | A            | Annual Leave | 2/01/2017 | 5/01/2017 |
|          2 | B            | Sick Leave   | 4/01/2017 | 6/01/2017 |
+------------+--------------+--------------+-----------+-----------+
+------------+
|  FullDate  |
+------------+
| 1/01/2017  |
| 2/01/2017  |
| 3/01/2017  |
| 4/01/2017  |
| 5/01/2017  |
| 6/01/2017  |
| 7/01/2017  |
| 8/01/2017  |
| 9/01/2017  |
| 10/01/2017 |
+------------+
结果

+------------+--------------+--------------+-----------+-----------+
| EmployeeId | EmployeeName | AbsenceType  | StartDate |  EndDate  |
+------------+--------------+--------------+-----------+-----------+
|          1 | A            | Annual Leave | 2/01/2017 | 5/01/2017 |
|          2 | B            | Sick Leave   | 4/01/2017 | 6/01/2017 |
+------------+--------------+--------------+-----------+-----------+
+------------+--------------+--------------+-----------+
| EmployeeId | EmployeeName | AbsenceType  |   Date    |
+------------+--------------+--------------+-----------+
|          1 | A            | Annual Leave | 2/01/2017 |
|          1 | A            | Annual Leave | 3/01/2017 |
|          1 | A            | Annual Leave | 4/01/2017 |
|          1 | A            | Annual Leave | 5/01/2017 |
|          2 | B            | Sick Leave   | 4/01/2017 |
|          2 | B            | Sick Leave   | 5/01/2017 |
|          2 | B            | Sick Leave   | 6/01/2017 |
+------------+--------------+--------------+-----------+
我通常使用SQL来创建这个结果,但是我不知道如何在PowerQuery中高效地创建它

+------------+--------------+--------------+-----------+-----------+
| EmployeeId | EmployeeName | AbsenceType  | StartDate |  EndDate  |
+------------+--------------+--------------+-----------+-----------+
|          1 | A            | Annual Leave | 2/01/2017 | 5/01/2017 |
|          2 | B            | Sick Leave   | 4/01/2017 | 6/01/2017 |
+------------+--------------+--------------+-----------+-----------+
SELECT A.EmployeeId
        ,A.EmployeeName
        ,A.AbsenceType
        ,D.FullDate
FROM Absence AS A
INNER JOIN dimDate AS D ON (
                D.FullDate >= A.StartDate
                AND D.FullDate <= A.EndDate
                )
选择A.EmployeeId
,A.雇员姓名
,A.缺席类型
,D.FullDate
从缺席到
内部联接dimDate为D ON(
D.FullDate>=A.StartDate

D.FullDate=StartDate和dimDate.FullDate无需合并。您可以创建一个列,其中包含StartDate和EndDate之间所有日期的嵌入列表。然后展开该列

+------------+--------------+--------------+-----------+-----------+
| EmployeeId | EmployeeName | AbsenceType  | StartDate |  EndDate  |
+------------+--------------+--------------+-----------+-----------+
|          1 | A            | Annual Leave | 2/01/2017 | 5/01/2017 |
|          2 | B            | Sick Leave   | 4/01/2017 | 6/01/2017 |
+------------+--------------+--------------+-----------+-----------+
let
    Source = Table1,
    #"Added Custom" = Table.AddColumn(Source, "Date", each List.Dates([StartDate],1+Duration.Days([EndDate]-[StartDate]),#duration(1,0,0,0))),
    #"Expanded Date" = Table.ExpandListColumn(#"Added Custom", "Date"),
    #"Changed Type" = Table.TransformColumnTypes(#"Expanded Date",{{"Date", type date}}),
    #"Removed Columns" = Table.RemoveColumns(#"Changed Type",{"StartDate", "EndDate"})
in
   #"Removed Columns"

无需合并。您可以创建一列,其中包含StartDate和EndDate之间所有日期的嵌入列表。然后展开该列

+------------+--------------+--------------+-----------+-----------+
| EmployeeId | EmployeeName | AbsenceType  | StartDate |  EndDate  |
+------------+--------------+--------------+-----------+-----------+
|          1 | A            | Annual Leave | 2/01/2017 | 5/01/2017 |
|          2 | B            | Sick Leave   | 4/01/2017 | 6/01/2017 |
+------------+--------------+--------------+-----------+-----------+
let
    Source = Table1,
    #"Added Custom" = Table.AddColumn(Source, "Date", each List.Dates([StartDate],1+Duration.Days([EndDate]-[StartDate]),#duration(1,0,0,0))),
    #"Expanded Date" = Table.ExpandListColumn(#"Added Custom", "Date"),
    #"Changed Type" = Table.TransformColumnTypes(#"Expanded Date",{{"Date", type date}}),
    #"Removed Columns" = Table.RemoveColumns(#"Changed Type",{"StartDate", "EndDate"})
in
   #"Removed Columns"