Vous ne savez pas quel RDMS vous utilisez mais cela devrait faire l'affaire. Les trucs datepart et dateadd sont spécifiques à tsql mais je suppose que vous auriez accès à des fonctions similaires sur n'importe quelle plate-forme que vous utilisez. Le cas dans l'où détermine la valeur de l'année à utiliser.
Réponse:
select c.companyid
,yearendingdate + '/' + convert(varchar, datepart(yy, dateadd(yy,1,o.orderdate))) as yearending
,sum(ordervalue) as numberoforders
from @orders o
join @companies c
on o.companyid = c.companyid
where orderdate between case when (cast(yearendingdate + '/' + convert(varchar, datepart(yy, o.orderdate)) as datetime) >= o.orderdate)
then yearendingdate + '/' + convert(varchar, datepart(yy, dateadd(yy,-1,o.orderdate)))
else yearendingdate + '/' + convert(varchar, datepart(yy, o.orderdate))
end
and
case when (cast(yearendingdate + '/' + convert(varchar, datepart(yy, o.orderdate)) as datetime) >= o.orderdate)
then yearendingdate + '/' + convert(varchar, datepart(yy, o.orderdate))
else yearendingdate + '/' + convert(varchar, datepart(yy, dateadd(yy,1,o.orderdate)))
end
group by c.companyid, o.orderdate, yearendingdate
Code pour comprendre problème:
declare @orders table (OrderDate datetime
,CompanyID varchar(20)
,OrderValue int)
insert into @orders
values (getdate(),'MS',2)
insert into @orders
values (DateAdd(year, -1, getdate()),'MS',3)
insert into @orders
values (DateAdd(year, -1, getdate()),'MS',1)
insert into @orders
values (DateAdd(year, 1, getdate()),'MS',4)
insert into @orders
values (DateAdd(year, 1, getdate()),'Blizzard',2)
insert into @orders
values (getdate(),'MS',11)
declare @companies table (CompanyID varchar(20)
,YearEndingDate varchar(20))
insert into @companies
values ('MS', '05/6')
insert into @companies
values ('Blizzard', '07/01')
select c.companyid
,o.orderdate
,yearendingdate + '/' + convert(varchar, datepart(yy, o.orderdate)) as sameyear
,yearendingdate + '/' + convert(varchar, datepart(yy, dateadd(yy,1,o.orderdate))) as plusyear
,yearendingdate + '/' + convert(varchar, datepart(yy, dateadd(yy,-1,o.orderdate))) as minusyear
from @orders o
join @companies c
on o.companyid = c.companyid
select c.companyid
,yearendingdate + '/' + convert(varchar, datepart(yy, dateadd(yy,1,o.orderdate))) as yearending
,sum(ordervalue) as numberoforders
from @orders o
join @companies c
on o.companyid = c.companyid
where orderdate between case when (cast(yearendingdate + '/' + convert(varchar, datepart(yy, o.orderdate)) as datetime) >= o.orderdate)
then yearendingdate + '/' + convert(varchar, datepart(yy, dateadd(yy,-1,o.orderdate)))
else yearendingdate + '/' + convert(varchar, datepart(yy, o.orderdate))
end
and
case when (cast(yearendingdate + '/' + convert(varchar, datepart(yy, o.orderdate)) as datetime) >= o.orderdate)
then yearendingdate + '/' + convert(varchar, datepart(yy, o.orderdate))
else yearendingdate + '/' + convert(varchar, datepart(yy, dateadd(yy,1,o.orderdate)))
end
group by c.companyid, o.orderdate, yearendingdate
Vous devez spécifier quel SGBD que vous utilisez. – ahsteele
Je laissais intentionnellement cela parce que je dois le faire dans un SQLite local db et un serveur central SqlServer – Jared