我的SQL生锈了,我无法想出这个。
我有一个包含Year Field的表,然后是一系列Period x字段。 所以日期看起来像
YEAR PERIOD1 PERIOD2 ... PERIOD12
2014 100 200 300
2015 200 300 400
我的问题是,要创建一个财政年度,我需要期间1-7 from 2015 and 8-12 from 2015
。
如果我可以编写一个select语句来给我这个或者在Crystal中写一个公式字段来给我这些句号的SUM
,我会被惹恼。
任何想法都会很棒......
答案 0 :(得分:1)
您的问题提到了2015年的两个期间范围。如果确实如此,您可以添加每行的期间字段。
但是,如果2015年财政年度由2015年的1-7期和 2014 期间的8-12期定义,您可以如下所示进行处理。
给出Oracle中的示例设置,例如:
CREATE TABLE tbl
(year int, period1 int, period2 int, period3 int, period4 int, period5 int, period6 int, period7 int, period8 int, period9 int, period10 int, period11 int, period12 int);
INSERT ALL
INTO tbl (year, period1, period2, period3, period4, period5, period6, period7, period8, period9, period10, period11, period12)
VALUES (2014, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200)
INTO tbl (year, period1, period2, period3, period4, period5, period6, period7, period8, period9, period10, period11, period12)
VALUES (2015, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300)
SELECT * FROM dual;
您可以使用几个“union all”语句对数据进行规范化。一旦标准化,就可以更容易地查询数据,并且可以应用案例陈述来按财务年度的期间范围进行拆分,如下所示:
select case when period between '08' and '12' then year + 1
when period between '01' and '07' then year
else null
end fin_year,
sum(amount) amount
from (select year, '01' period, period1 amount from tbl union all
select year, '02' period, period2 amount from tbl union all
select year, '03' period, period3 amount from tbl union all
select year, '04' period, period4 amount from tbl union all
select year, '05' period, period5 amount from tbl union all
select year, '06' period, period6 amount from tbl union all
select year, '07' period, period7 amount from tbl union all
select year, '08' period, period8 amount from tbl union all
select year, '09' period, period9 amount from tbl union all
select year, '10' period, period10 amount from tbl union all
select year, '11' period, period11 amount from tbl union all
select year, '12' period, period12 amount from tbl
)
group by case when period between '08' and '12' then year + 1
when period between '01' and '07' then year
else null
end;
祝你好运!
答案 1 :(得分:1)
您可以按顺序返回句点(或者只是将它们全部添加)并以任何方便的方式对它们进行别名。
select t1.PERIOD8 + ... t1.PERIOD12 + t2.PERIOD1 + t2.PERIOD2, + ... t1.PERIOD7
from T as t1 inner join T as t2 on t2.YEAR = t1.YEAR + 1
where t1.YEAR = 2014;
我想这可能比一堆工会更快,尽管我喜欢能够处理单个列中所有数据的想法。