Sql 在日期特定表中查询非日期特定数据

Sql 在日期特定表中查询非日期特定数据,sql,ms-access,Sql,Ms Access,我有一个不特定于日期的数据集,但我希望通过SQL返回与开始日期对齐的数据 下面是我的数据示例 Project mon1 mon2 mon3 mon4 ------- --- --- --- --- Test1 .15 .20 .10 1.5 Test2 .50 .35 .25 .15 我想返回另一个显示开始日期的表 Project Start ------- ----- Test1 May Test2 A

我有一个不特定于日期的数据集,但我希望通过SQL返回与开始日期对齐的数据

下面是我的数据示例

Project   mon1  mon2  mon3  mon4
-------   ---   ---   ---   ---
Test1     .15   .20   .10   1.5
Test2     .50   .35   .25   .15
我想返回另一个显示开始日期的表

Project   Start
-------   -----
Test1     May
Test2     April
因此,查询的结果如下所示

Project  Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
-------  ---  ---  ---  ---  ---  ---  ---  ---  ---  ---  ---  ---
Test1                        .15  .20  .10  1.5
Test2                   .50  .35  .25  .15

关于如何构造SQL有什么想法吗?

您可以使用
iif()
来实现这一点,但这很痛苦。以下是一个例子:

select d.project,
       iif(start = 'Jan' then mon1, iif(start = 'Dec', mon2, iif(start = 'Nov', mon3, iif(start = 'Oct', mon4, NULL)))) as Jan,
       iif(start = 'Feb' then mon1, iif(start = 'Jan', mon2, iif(start = 'Dec', mon3, iif(start = 'Nov', mon4, NULL)))) as Feb,
       . . . 
from data as d join
     othertable as t
     on d.project = t.project;

我要建议的只适用于支持某种形式的模运算/函数的RDBM,这是一个真正的延伸

首先,您需要创建一个包含每个月的名称/值的表,如下所示:

MonthNbr   MonthName
---------- -----------
1          January
2          February
3          March
4          April
5          May
6          June
7          July
8          August
9          September
10         October
11         November
12         December
SELECT
   proj.Project,
   if (MOD(mnth.MonthNbr + 0, 12) == 1) data.mon1 "Jan",
   if (MOD(mnth.MonthNbr + 1, 12) == 2) data.mon2 "Feb",
   if (MOD(mnth.MonthNbr + 2, 12) == 3) data.mon3 "Mar",
   if (MOD(mnth.MonthNbr + 3, 12) == 4) data.mon4 "Apr",
   if (MOD(mnth.MonthNbr + 4, 12) == 5) data.mon5 "May",
   if (MOD(mnth.MonthNbr + 5, 12) == 6) data.mon6 "Jun",
   if (MOD(mnth.MonthNbr + 6, 12) == 7) data.mon7 "Jul",
   if (MOD(mnth.MonthNbr + 7, 12) == 8) data.mon8 "Aug",
   if (MOD(mnth.MonthNbr + 8, 12) == 9) data.mon9 "Sep",
   if (MOD(mnth.MonthNbr + 9, 12) == 10) data.mon10 "Oct",
   if (MOD(mnth.MonthNbr + 10, 12) == 11) data.mon11 "Nov",
   if (MOD(mnth.MonthNbr + 11, 12) == 12) data.mon12 "Dec"
FROM
   project_table proj
       JOIN months_table mnth ON (proj.Start = mnth.MonthName)
       JOIN data_type data ON (proj.Project = data.Project)
然后你需要把这些表连接在一起,计算出哪个月去哪里,显示,类似这样的内容:

MonthNbr   MonthName
---------- -----------
1          January
2          February
3          March
4          April
5          May
6          June
7          July
8          August
9          September
10         October
11         November
12         December
SELECT
   proj.Project,
   if (MOD(mnth.MonthNbr + 0, 12) == 1) data.mon1 "Jan",
   if (MOD(mnth.MonthNbr + 1, 12) == 2) data.mon2 "Feb",
   if (MOD(mnth.MonthNbr + 2, 12) == 3) data.mon3 "Mar",
   if (MOD(mnth.MonthNbr + 3, 12) == 4) data.mon4 "Apr",
   if (MOD(mnth.MonthNbr + 4, 12) == 5) data.mon5 "May",
   if (MOD(mnth.MonthNbr + 5, 12) == 6) data.mon6 "Jun",
   if (MOD(mnth.MonthNbr + 6, 12) == 7) data.mon7 "Jul",
   if (MOD(mnth.MonthNbr + 7, 12) == 8) data.mon8 "Aug",
   if (MOD(mnth.MonthNbr + 8, 12) == 9) data.mon9 "Sep",
   if (MOD(mnth.MonthNbr + 9, 12) == 10) data.mon10 "Oct",
   if (MOD(mnth.MonthNbr + 10, 12) == 11) data.mon11 "Nov",
   if (MOD(mnth.MonthNbr + 11, 12) == 12) data.mon12 "Dec"
FROM
   project_table proj
       JOIN months_table mnth ON (proj.Start = mnth.MonthName)
       JOIN data_type data ON (proj.Project = data.Project)
确切的语法是针对您正在实现的任何数据库的,我不相信它在运行时会起作用(data.mon4实际上应该在1月份,因为起始编号是多少)。您可能还需要将mon1/mon2/etc转换为数字,然后对每个列进行大规模解码以获得正确的值


实际上,存储过程(Transact-SQL/它支持的任何过程语言)更合适,在SQL本身中编写所有必要的逻辑可能根本不可能。

项目可以在任何月份开始,持续时间可能会持续到下一年。