2013-04-25 62 views
0

我正在尝试为整个系列的不同条件做一个选择。我基本上会拿今天的日期,并用它来对付我们的发票表,以便弄清楚我们今年的情况,与过去几年相比。最后,我基本上想要列出Year,Year To Date Sales,Year To Date Sales和Month to Date Sales列。我已经开始为此创建一个循环,但是我遇到的问题是它正在执行多个选择,而不是返回一个数据集,而是返回3.选择多个标准条件

是解决此问题的最佳方法一个虚拟表格,填充我的结果,然后从中选择它们?

这是我到目前为止有:

DECLARE @startDate date, @endDate date; 
DECLARE @counter int = 0; 


WHILE @counter < 3 BEGIN 
    --set start and end dates 
    SELECT @startDate = CONVERT(date, (CONVERT(nvarchar, YEAR(DATEADD(YEAR,-1 * @counter, CONVERT(date, GETDATE())))) + '-02-01')); 
    SELECT @endDate = DATEADD(YEAR,-1 * @counter, CONVERT (date, GETDATE())); 

    --select results 
    SELECT YEAR(ib.DateDelivered) [Year], SUM(ib.TotalAmountLessFreight) [YTD Sale] 
    FROM InvoiceBase ib 
    WHERE ib.DateDelivered < @endDate 
     AND ib.DateDelivered > @startDate 
    GROUP BY YEAR(ib.DateDelivered); 

    --increment 
    SET @counter = @counter + 1; 
END 
+0

你能告诉我们一个你正在得到的结果集和你想看到的例子吗? – Melanie 2013-04-25 17:54:50

+0

现在我在结果集中获得年度和年度销售额列。但是我得到了2013年的一个结果集,2012年的一个结果集和2011年的结果集。我希望看到每个结果集都有行。 – 2013-04-25 17:58:49

+2

而不是使用计数器,更改startDate和endDate以包含您想要查询的所有三年。 – Melanie 2013-04-25 18:02:00

回答

1

这样做将是一个查询的最佳方式。请尝试:

;with cte as 
(select i.*, 
     dateadd(year, datediff(year,DateDelivered,getdate()), getdate()) [YearEnd] 
FROM InvoiceBase i) 
select YEAR(DateDelivered) [Year], 
     SUM(case when DateDelivered <= YearEnd 
       then TotalAmountLessFreight end) [YTD Sales], 
     SUM(case when DateDelivered <= YearEnd and 
        month(DateDelivered) >= floor((month(YearEnd)+2)/3)*3-2 
       then TotalAmountLessFreight end) [QTD Sales], 
     SUM(case when DateDelivered <= YearEnd and 
        datediff(month, DateDelivered, YearEnd) = 0 
       then TotalAmountLessFreight end) [MTD Sales] 
FROM cte 
GROUP BY YEAR(DateDelivered)