0

如果我有下表:

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)
4

2 回答 2

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

于 2013-05-30T14:42:24.443 回答
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)
于 2013-05-29T19:21:58.150 回答