Sql 在日期特定表中查询非日期特定数据
我有一个不特定于日期的数据集,但我希望通过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
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本身中编写所有必要的逻辑可能根本不可能。项目可以在任何月份开始,持续时间可能会持续到下一年。