如何解决交叉表查询空位
我有一张表,其中指定了 ID、长度、工作时间、天数
我需要创建一个交叉表查询,其中每天都会有一天内完成的工作时间。如果有空格,我需要在那里有数字零。然而,在工作的长度之后,我需要在那里留有空白。
这是我的解决方案:
TRANSFORM Nz(Sum([SampleTable]![WorkHours]))+0 AS [Sum]
SELECT SampleTable.ID,SampleTable.Length
FROM SampleTable
WHERE (((SampleTable.Day)>0 And (SampleTable.Day)<200))
GROUP BY SampleTable.ID,SampleTable.Length
ORDER BY SampleTable.ID,SampleTable.Length
PIVOT SampleTable.Day;
我需要在检查的长度之后去掉零,取而代之的是空值。我的解决方案是在任何地方创建零,而不仅仅是在 start 到 length 之间的间隔中。
当我尝试这个解决方案时,它仍然没有任何好处。只有几个空格在错误的地方。
TRANSFORM IIf([sampleTable].[length]>[sampleTable].[day],Null,Nz(Sum([SampleTable]![WorkHours]))+0) AS [Sum]
SELECT SampleTable.ID,SampleTable.Length
PIVOT SampleTable.Day;
解决方法
本质上,您面临着间隙和孤岛问题,您需要用零工时填补缺失的间隙和不连续的天数孤岛,并有条件地通过 ID
取消值。对于您细微的需求,请考虑以下基本步骤。
-
创建一个包含所有可能的
INTO
、ID
和Day
的交叉连接表(使用Length
子句),其中WorkHours
填充为零:SELECT i.ID,d.Day,i.Length,0 AS WorkHours INTO myCrossJoinTable FROM (SELECT DISTINCT [ID],[Length] FROM LengthWorkHoursDay) i,(SELECT DISTINCT [Day] FROM LengthWorkHoursDay) d WHERE d.Day IS NOT NULL
要填写最多 100 天(或表中最多
Length
),请使用 VBA 构建连续天数:Sub AppendData() Dim i As Long,sql As String CurrentDb.Execute "DELETE FROM SampleTable" For i = 1 to DMax("[Length]","SampleTable") sql = "INSERT INTO myCrossJoinTable ([ID],[Day],[Length],[WorkHours]) " _ & "SELECT DISTINCT [ID]," & i & ",0 " _ & "FROM SampleTable" CurrentDb.Execute sql Next i End Sub
-
创建一个单独的查询,将原始表与交叉连接表连接起来,以填补工作时间为零的顺序数据中的空白和不连续性。
SELECT d.ID,t.Day,d.Length,IIF(t.WorkHours IS NULL,d.WorkHours,t.WorkHours) AS WHours FROM myCrossJoinTable As d LEFT JOIN SampleTable AS t ON t.ID = d.ID AND t.Day = d.Day WHERE (d.Day > 0 And d.Day < 200)
-
运行基于上述基本查询的最终交叉表查询,并使用条件
SUM
使值无效:TRANSFORM SUM(IIF(q.Day > q.Length,NULL,q.WHours)) AS [Sum] SELECT q.ID,q.Length FROM mySavedQuery q GROUP BY q.ID,q.Length ORDER BY q.ID,q.Length PIVOT q.Day
ID 长度 1 2 3 4 5 6 7 8 9 10 11 12 13 14 100 1 4 10 5 0 137 2 6 25 0 0 0 67 0 3 10 6 0 0 0 0 0 0 4 0 0 4 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 5 10 2 1 2 1 2 1 2 1 2 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。