2009-06-26 4 views
0

によってsimplicities酒のために、私は私が持っているものと同様の例を構成しているよ:SQL:どのグループにカスタムイヤー

のは、DBは受注日フィールドでの注文のテーブルとCompanyフィールドを持っているとしましょう。次に、企業のテーブルがあり、各レコードにYearEndingDate(年がその日付に毎年終了することを示す、たとえば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 

+1

あなたが使用しているDBMSものを指定する必要があります。 – ahsteele

+0

私はローカルのSQLiteデータベースと中央のSqlServerの両方でそれを行う必要があるため、これを意図的に残していました – Jared

答えて

1

使用しているRDMSはわかりませんが、これはすべきことです。 datepartとdateaddはtsql特有のものですが、使用しているどのプラットフォームでも同様の機能にアクセスできると思います。 whereのcaseは、使用する年の値を決定します。

回答:問題を把握するために

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 
+0

この回答は数回反復されています。年末の日付が捨てられてしまいます。その問題を説明するケースステートメントを追加しました。 最後に、テーブル変数があり、ソリューションをテストできるようになりました。 – ahsteele