문제

단순화를 위해, 나는 내가 가진 것과 비슷한 예를 만들 것이다.

DB에 주문서 필드와 회사 필드가있는 주문 테이블이 있다고 가정 해 봅시다. 그런 다음 회사의 테이블이 있으며 각 레코드는 연간 시간을 가지고 있습니다 (연도가 매년 해당 날짜에 끝나는 것을 의미합니다. 예 : 6/6).

매년 모든 주문을 추가해야합니다.

나는 그것이 이와 같은 것이되어야한다고 생각하지만 나는 그것을 알아낼 수 없다 :

SELECT SUM(orderValue),
CASE WHEN orderDate <= YearEndingDate THEN DatePart(year, orderDate)
CASE WHEN orderDate > YearEndingDate THEN DatePart(year, orderDate) + 1
END as Year
FROM Orders
INNER JOIN Company ON Company.companyID = Order.companyID
GROUP By Company, Year

어떤 아이디어?

도움이 되었습니까?

해결책

어떤 RDM을 사용하고 있는지 확실하지 않지만 이것이 트릭을 수행해야합니다. DatePart 및 Dateadd Timess는 TSQL에 따라 다르지만 사용중인 플랫폼에서 유사한 기능에 액세스 할 수 있다고 가정합니다. 어디에서 사용할 것인지를 결정하는 경우.

대답:

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

문제를 파악하기위한 코드 :

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top