如何查找ACCESS表行中的第一列,其值不是零空白?

时间:2013-11-21 16:04:44

标签: sql ms-access

我有一张表,其中包括每个月的栏目(1月13日,2月13日,3月13日等),为期四年。我需要找到每行中第一列的值不是“0”(零)。然后我需要找到一个非零值的最后一列。

查询将让我知道资源的开始月份和结束月份。我编写了一个Excel公式,但现在我需要将相同的功能转换为Access。当我找到每个列时,我需要检索列标题。任何人都可以帮我查询我的SQL吗?

基于查询的报告将是

ResourceName, StartDate EndDate
Bob Sample    Apr-13    Apr-15 

涉及实际的两个表。 Resource表,包含个人的所有信息和预测表,其中月份为列,资源ID和行任务。对于每个月,预计个人将按照给定时间的百分比工作。我们并不关心个人开始的实际日期(11/20/201),只关注月份。因此,任务1的资源预计将在11月13日工作.5%的时间,这将是资源工作的第一个月。然后,可以预测该资源将在接下来的九个月内以相同的水平运行。因此,8月14日的列将是.5值的最后一个月。之后,所有列都包含零。

2 个答案:

答案 0 :(得分:0)

在关系数据库中,您不会像这样存储您的数据。相反,你将有2个表:

  1. 您的资源
  2. 资源运行的月份(用于任务)
  3. 示例:

    表1资源:

    ID | Resource_Name
    1  | Mr. A
    2  | Mrs. B
    

    表2预测:

    FC_ID | FC_Month   | FC_Resource_ID | FC_Task     | FC_Percentage
    1     | 2013-10-01 | 1              | actiontask! | 0.05
    2     | 2013-11-01 | 1              | actiontask! | 0.10
    3     | 2013-12-01 | 1              | actiontask! | 0.05
    4     | 2013-07-01 | 2              | boring task | 0.3
    5     | 2013-08-01 | 2              | boring task | 0.25
    6     | 2013-09-01 | 2              | boring task | 0.3
    7     | 2013-10-01 | 2              | boring task | 0.1
    

    然后,您可以使用SQL来请求开始和结束日期:

    SELECT Resource_Name, Min(FC_Month) AS colMin, Max(FC_Month) As colMax 
    FROM tblForecast INNER JOIN tblResources ON FC_Resource_ID=Resource_ID
    GROUP BY FC_Resource_ID, Resource_Name
    

    此示例的结果将是:

    Mr. A  | 2013-10-01 | 2013-12-01
    Mrs. B | 2013-07-01 | 2013-10-01
    

答案 1 :(得分:0)

(我将我的例子限制在六个月,因为我很懒。)

所以我们在一个名为[Forecast]的表中有一些“宽”数据:

ResourceID  Jul-13  Aug-13  Sep-13  Oct-13  Nov-13  Dec-13
----------  ------  ------  ------  ------  ------  ------
         1       0     0.5       1     0.5       0       0
         2       0       0       2       0       0       0
         3       0       0       3       4       0       0

首先在Access中创建一个名为[ForecastUnpivoted]的已保存查询,将“短宽”数据转换为“长瘦”数据:

    SELECT ResourceID, "2013-07" AS forecastMonth, [Jul-13] AS forecastValue
    FROM Forecast
UNION ALL
    SELECT ResourceID, "2013-08" AS forecastMonth, [Aug-13] AS forecastValue
    FROM Forecast
UNION ALL
    SELECT ResourceID, "2013-09" AS forecastMonth, [Sep-13] AS forecastValue
    FROM Forecast
UNION ALL
    SELECT ResourceID, "2013-10" AS forecastMonth, [Oct-13] AS forecastValue
    FROM Forecast
UNION ALL
    SELECT ResourceID, "2013-11" AS forecastMonth, [Nov-13] AS forecastValue
    FROM Forecast
UNION ALL
    SELECT ResourceID, "2013-12" AS forecastMonth, [Dec-13] AS forecastValue
    FROM Forecast

返回

ResourceID  forecastMonth  forecastValue
----------  -------------  -------------
         1  2013-07                    0
         2  2013-07                    0
         3  2013-07                    0
         1  2013-08                  0.5
         2  2013-08                    0
         3  2013-08                    0
         1  2013-09                    1
         2  2013-09                    2
         3  2013-09                    3
         1  2013-10                  0.5
         2  2013-10                    0
         3  2013-10                    4
         1  2013-11                    0
         2  2013-11                    0
         3  2013-11                    0
         1  2013-12                    0
         2  2013-12                    0
         3  2013-12                    0

现在我们可以使用Min()和Max()来为每个资源提供开始结束日期

SELECT 
    ResourceID, 
    Min(forecastMonth) AS StartMonth, 
    Max(forecastMonth) AS EndMonth
FROM ForecastUnpivoted
WHERE forecastValue <> 0
GROUP BY ResourceID

这给了我们

ResourceID  StartMonth  EndMonth
----------  ----------  --------
         1  2013-08     2013-10 
         2  2013-09     2013-09 
         3  2013-09     2013-10