我有一张表,其中包括每个月的栏目(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值的最后一个月。之后,所有列都包含零。
答案 0 :(得分:0)
在关系数据库中,您不会像这样存储您的数据。相反,你将有2个表:
示例:强>
表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