2013-05-29 65 views
0

T-SQL如果我有如下表:关于当前的销售和以前的销售

CREATE TABLE [dbo].[Sales](
[SaleDate] [datetime] NULL, 
[SaleAmt] [money] NULL 
) ON [PRIMARY] 

我怎么会每月获取的销售总和,但也表明了前一个月的数字。

我想下面的工作,但它并不

select 
    DATEPART(m,s1.saledate), SUM(s1.SaleAmt), SUM(s2.SaleAmt) 
from 
    sales s1 
inner join 
    Sales s2 on DATEPART(m, DateAdd(m, -1, s2.saledate)) = DATEPART(m, s1.saledate) 
group by 
    DATEPART(m, s1.saledate) 
+2

什么叫“秀意思上个月的数字。“你能提供一个你想要的输出样本吗? –

回答

0

我想我已经想出了一个非常简单的解决办法,但我不认为它相当好,因为使用自联接方式

select DATEPART(m,s1.saledate) as Month, 
SUM(s1.SaleAmt) as CurrentSales, 
(select SUM(SaleAmt) 
from Sales where DATEPART(m,saledate)=DATEPART(m,s1.saledate)-1) as PreviousSales from    
sales s1 
group by DATEPART(m,s1.saledate) 
0

根据您所需的输出,下列解决方案之一应该适合您。我可能会更倾向于第二种方案,但一切都取决于你希望看到什么:

select 
    s2.month as 'C-MONTH', 
    s1.month as 'P-MONTH', 
    s2.amt as 'C-AMT', 
    s1.amt as 'P-AMT' 
from 
(
    select 
    datepart(m, saledate) as month, 
    sum(SaleAmt) as amt 
    from 
    Sales 
    group by 
    datepart(m, saledate) 
) s1, 
(
    select 
    datepart(m, saledate) as month, 
    sum(SaleAmt) as amt 
    from 
    Sales 
    group by 
    datepart(m, saledate) 
) s2 
where 
    s2.month = s1.month + 1 

演示:http://sqlfiddle.com/#!3/66ad9/1

select 
    s2.month as 'C-MONTH', 
    s1.month as 'P-MONTH', 
    s2.amt as 'C-AMT', 
    s1.amt as 'P-AMT' 
from 
(
    select 
    datepart(m, saledate) as month, 
    sum(SaleAmt) as amt 
    from 
    Sales 
    group by 
    datepart(m, saledate) 
) s1 
right outer join 
(
    select 
    datepart(m, saledate) as month, 
    sum(SaleAmt) as amt 
    from 
    Sales 
    group by 
    datepart(m, saledate) 
) s2 
on 
    s2.month = s1.month + 1 

演示:http://sqlfiddle.com/#!3/7a670/1