2012-08-28 171 views
1

我有这个数据显示按年份分组的综合报告。我使用的是一个简单的 GROUP BY YEAR(BookingDate)子句,一切正常。但我想要的是一年是财政年度(1 April31 May)而不是正常的日历年,那么我该怎么做?查询是..sql:通过基于计算列的组?

SELECT 
    CONVERT(VARCHAR(25), c.Duration) AS Duration, 
    COALESCE(c.totalbookings, 0) AS totalbookings 
FROM 
    (SELECT 
       YEAR(bookingdate) AS Duration, 
       COUNT(*) AS totalbookings 
      FROM 
       entbookings 
      WHERE [email protected] 
      GROUP BY YEAR(bookingdate) 
    ) AS c 
LEFT OUTER JOIN 
    (SELECT 
       Duration, 
       SUM(totalitems) 'bkdqty' 
      FROM 
       [yrItemWISeTotalQty] (@BranchId) AS BkdQty 
      GROUP BY Duration 
    ) AS d 
ON c.Duration = d.Duration 

yrItemWISeTotalQty被定义为

CREATE FUNCTION [dbo].[yrItemWiseTotalQty] 
(
@BrachId VARCHAR(MAX) 
) 

RETURNS TABLE AS 
    RETURN 
SELECT 
    YEAR(EntBookings.BookingDate) AS Duration, 
    Sum(dbo.EntBookings.ItemCost) AS totalcost, 
WHERE EntBookings.BranchId = @BrachId 
GROUP BY Year(EntBookings.BookingDate) 

,我再次使用GROUP BY Year()该做的工作很棒,但我需要修改它取财年即(4月1日到3月31日)。我该怎么做?

回答

1

试试这个:

SELECT 
    case when month(EntBookings.BookingDate) <4 
     then YEAR(EntBookings.BookingDate)-1 
     else YEAR(EntBookings.BookingDate) end AS Duration, 
    Sum(dbo.EntBookings.ItemCost) AS totalcost 
WHERE EntBookings.BranchId = @BrachId 
GROUP BY case when month(EntBookings.BookingDate) <4 
     then YEAR(EntBookings.BookingDate)-1 
     else YEAR(EntBookings.BookingDate) end as [year] 
0

定义SQL函数
getFinancialYear(Data[TimeStamp])
返回财政年度号并用它来GROUP BY和。
I.e.

... 
GROUP BY getFinancialYear(BookingDate) 
...