MS Access - 按用户和星期几汇总数据

时间:2018-05-28 13:08:46

标签: ms-access

从Excel中,我必须按用户和星期几提取位于Access数据库中的数据,希望采用以下格式:

Username  |  Monday  | Tuesday  |  Wednesday  |  Thursday  |  Friday
User1     |  1234    | 4567     |             |            |  0001
User2     |          |          |  7539       |            |

我目前使用的查询没有提供上述格式:

SELECT 
    tlkpEmployee.EmployeeLast, 
    tlkpEmployee.EmployeeFirst
    IIf([AbsencePeriod]="Range of dates", IIf("Monday" In (SELECT JourDeSemaine FROM tlkpJulien WHERE SemaineSeTerminant = #2018-08-03# AND LaDate Between tblAbsences.AbsenceDateDébut AND 
    tblAbsences.AbsenceDateFin),[tlkpTypeAbsence].[TypeAbsenceCodeTemps],""),IIf("Monday" IN (SELECT JourDeSemaine FROM tlkpJulien WHERE LaDate = tblAbsences.AbsenceDateDébut),[TypeAbsenceCodeTemps],"")) AS MONDAY, 
    IIf([AbsencePeriod]="Range of dates",IIf("Tuesday" In (SELECT JourDeSemaine FROM tlkpJulien WHERE SemaineSeTerminant = #2018-08-03# AND LaDate Between tblAbsences.AbsenceDateDébut AND 
            tblAbsences.AbsenceDateFin),[tlkpTypeAbsence].[TypeAbsenceCodeTemps],""),IIf("Tuesday" IN (SELECT JourDeSemaine FROM tlkpJulien WHERE LaDate = 
            tblAbsences.AbsenceDateDébut),[TypeAbsenceCodeTemps],"")) AS TUESDAY, IIf([AbsencePeriod]="Range of dates",IIf("Wednesday" In (SELECT JourDeSemaine FROM tlkpJulien WHERE SemaineSeTerminant = #2018-08-03# AND LaDate Between tblAbsences.AbsenceDateDébut AND 
            tblAbsences.AbsenceDateFin),[tlkpTypeAbsence].[TypeAbsenceCodeTemps],""),IIf("Wednesday" IN (SELECT JourDeSemaine FROM tlkpJulien WHERE LaDate = 
            tblAbsences.AbsenceDateDébut),[TypeAbsenceCodeTemps],"")) AS WEDNESDAY, IIf([AbsencePeriod]="Range of dates",IIf("Thursday" In (SELECT JourDeSemaine FROM tlkpJulien WHERE SemaineSeTerminant = #2018-08-03# AND LaDate Between tblAbsences.AbsenceDateDébut AND
            tblAbsences.AbsenceDateFin),[tlkpTypeAbsence].[TypeAbsenceCodeTemps],""),IIf("Thursday" IN (SELECT JourDeSemaine FROM tlkpJulien WHERE LaDate = 
            tblAbsences.AbsenceDateDébut),[TypeAbsenceCodeTemps],"")) AS THURSDAY, IIf([AbsencePeriod]="Range of dates",IIf("Friday" In (SELECT JourDeSemaine FROM tlkpJulien WHERE SemaineSeTerminant = #2018-08-03# AND LaDate Between tblAbsences.AbsenceDateDébut AND 
            tblAbsences.AbsenceDateFin),[tlkpTypeAbsence].[TypeAbsenceCodeTemps],""),IIf("Friday" IN (SELECT JourDeSemaine FROM tlkpJulien WHERE LaDate = 
            tblAbsences.AbsenceDateDébut),[TypeAbsenceCodeTemps],"")) AS FRIDAY FROM (((tlkpAbsenceCatégorie INNER JOIN ((tlkpEmployee INNER JOIN tblAbsences ON tlkpEmployee.EmployeeID = tblAbsences.EmployeeID) INNER JOIN tlkpTypeAbsence ON tblAbsences.TypeAbsenceID = tlkpTypeAbsence.TypeAbsenceID) ON tlkpAbsenceCatégorie.TypeAbsenceCatégorieID = tlkpTypeAbsence.TypeAbsenceCatégorieID) INNER JOIN tlkpChefs ON tlkpEmployee.ChefID = tlkpChefs.ChefID) INNER JOIN tlkpJulien ON (tblAbsences.AbsenceDateDébut = tlkpJulien.LaDate) AND (tblAbsences.AbsenceDateFin = tlkpJulien.LaDate)) INNER JOIN tlkpAbsencePeriod ON tblAbsences.AbsencePeriodID = tlkpAbsencePeriod.AbsencePeriodID WHERE (tlkpChefs.ChefLastName & ", " & tlkpChefs.ChefFirstName) = 'TeamLeader Name';

对代码感到抱歉,我无法按照自己的意愿进行编辑。

上述查询的结果是(使用第一个示例):

    Username  |  Monday  | Tuesday  |  Wednesday  |  Thursday  |  Friday
User1     |  1234    |          |             |            |      
User1     |          | 4567     |             |            |      
User1     |          |          |             |            |  0001
User2     |          |          |  7539       |            |

有人能指出我正确的方向吗?任何建议将不胜感激。

提前致谢。

结构是这样的:

tblAbsences 
AbsenceID   Long Integer data
EmployeeID  Long Integer data
TypeAbsenceID   Long Integer data
AbsenceDateDébut    Date value data
AbsenceDateFin  Date value data

tlkpAbsenceCatégorie
TypeAbsenceCatégorieID  Long Integer data
TypeAbsenceCatégorieNom Text data (variable width)

tlkpAbsencePeriod
AbsencePeriodID Long Integer data
AbsencePeriod   Text data (variable width)

tlkpEmployee
EmployeeID  Long Integer data
EmployeeNom Text data (variable width)
EmployeeFirst   Text data (variable width)
EmployeeLast    Text data (variable width)
EmployeeCiUsager    Text data (variable width)

tlkpTypeAbsence 
TypeAbsenceID   Long Integer data
TypeAbsence Text data (variable width)
TypeAbsenceCodeTemps    Long Integer data
TypeAbsenceCatégorieID  Long Integer data

我使用@ tim-biegeleisen建议来使用交叉表查询并提出:

TRANSFORM Max(tlkpTypeAbsence.TypeAbsenceCodeTemps) AS MaxOfTypeAbsenceCodeTemps
SELECT qryJoinEmployeeAbsences.EmployeeNom
FROM tlkpChefs RIGHT JOIN (tlkpJulien RIGHT JOIN (tlkpTypeAbsence RIGHT JOIN qryJoinEmployeeAbsences ON tlkpTypeAbsence.TypeAbsenceID = 
qryJoinEmployeeAbsences.TypeAbsenceID) ON (tlkpJulien.LaDate = qryJoinEmployeeAbsences.AbsenceDateDébut) AND (tlkpJulien.LaDate = qryJoinEmployeeAbsences.AbsenceDateFin)) ON tlkpChefs.ChefID = qryJoinEmployeeAbsences.ChefID
WHERE (((tlkpJulien.SemaineSeTerminant)=#8/3/2018#) AND ((tlkpChefs.ChefNom)='Gauthier-Hamel, Alexandre'))
GROUP BY qryJoinEmployeeAbsences.EmployeeNom, qryJoinEmployeeAbsences.EmployeeTelephone, qryJoinEmployeeAbsences.EmployeeCiUsager, qryJoinEmployeeAbsences.EmployeeCIDP, tlkpChefs.ChefNom
ORDER BY qryJoinEmployeeAbsences.EmployeeNom
PIVOT tlkpJulien.JourDeSemaine;

我最初从Access得到一个错误,说我无法在原始查询中没有LEFT JOIN两个表没有数据,所以我创建了一个名为qryJoinEmployeeAbsences的单独查询来处理连接。

我差不多了,现在查询给了我想要的东西但是对于没有缺席数据的用户我没有得到任何结果。

1 个答案:

答案 0 :(得分:1)

您的查询有一个简单的修复方法,即只需按username进行汇总,然后选择MAX的精选列。像这样:

SELECT 
    tlkpEmployee.username,
    MAX(IIf([AbsencePeriod]="Range of dates", IIf("Monday" In (SELECT JourDeSemaine FROM tlkpJulien WHERE SemaineSeTerminant = #2018-08-03# AND LaDate Between tblAbsences.AbsenceDateDébut AND 
tblAbsences.AbsenceDateFin),[tlkpTypeAbsence].[TypeAbsenceCodeTemps],""),IIf("Monday" IN (SELECT JourDeSemaine FROM tlkpJulien WHERE LaDate = tblAbsences.AbsenceDateDébut),[TypeAbsenceCodeTemps],""))) AS MONDAY
    ... other days here
GROUP BY
    tlkpEmployee.username;

我发现您向我们展示的数据存在差异。查询选择第一个和最后一个员工姓名,而您的预期输出显示用户名。我回答假设你想要后者。

顺便说一下,这种类型的查询的名称是“pivot query”,因为我们在整个表的不同列中生成日期信息。