交叉表查询空位

问题描述

我有一张表,其中指定了 ID、长度、工作时间、天数

enter image description here

我需要创建一个交叉表查询,其中每天都会有一天内完成的工作时间。如果有空格,我需要在那里有数字零。然而,在工作的长度之后,我需要在那里留有空白。

这是我的解决方案:

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;

enter image description here

我需要在检查的长度之后去掉零,取而代之的是空值。我的解决方案是在任何地方创建零,而不仅仅是在 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 取消值。对于您细微的需求,请考虑以下基本步骤。

  1. 创建一个包含所有可能的 INTOIDDay 的交叉连接表(使用 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
    
  2. 创建一个单独的查询,将原始表与交叉连接表连接起来,以填补工作时间为零的顺序数据中的空白和不连续性。

    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)
    
  3. 运行基于上述基本查询的最终交叉表查询,并使用条件 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...