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

时间:2016-03-14 01:28:34

标签: sql ms-access

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

以下是我的数据示例

console.log(vm)

我想根据显示开始日期的另一张表返回

Uncaught ReferenceError: vm is not defined(…)

所以查询的结果看起来像这样。

Project   mon1  mon2  mon3  mon4
-------   ---   ---   ---   ---
Test1     .15   .20   .10   1.5
Test2     .50   .35   .25   .15

关于如何构建SQL的任何想法?

2 个答案:

答案 0 :(得分:0)

您可以使用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;

答案 1 :(得分:0)

我将建议只适用于支持某种形式的模数运算/函数的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)

确切的语法是你正在实现的任何数据库,并且当它翻转时我不相信它是有效的(data.mon4实际上应该在1月,因为无论起始编号是什么)。您可能还需要将mon1 / mon2 / etc转换为数字,然后为每列创建一个大量的DECODE以获得正确的值。

实际上,存储过程/ TransactSQL / whatever-procedure-language-it-supports)更合适,在SQL本身编写所有必要的逻辑可能是不可能的。