我有一个不是特定于日期的数据集,但我希望通过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的任何想法?
答案 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本身编写所有必要的逻辑可能是不可能的。