Sql 如何减去列中有一个匹配值的两行

Sql 如何减去列中有一个匹配值的两行,sql,postgresql,subtraction,Sql,Postgresql,Subtraction,我在比较不同年份同一周的销售额。比如2010年和2011年的第一周。因此,通过我的查询,我得到了这样的结果 week|year|sales 1 |2010|5 1 |2011|10 2 |2010|7 2 |2011|13 我的查询如下所示: SELECT min(x.id) AS id, week as week, year, COUNT(*) AS amount, SUM(price_unit) AS price FROM ( SELECT so.id as i

我在比较不同年份同一周的销售额。比如2010年和2011年的第一周。因此,通过我的查询,我得到了这样的结果

week|year|sales
1   |2010|5
1   |2011|10
2   |2010|7
2   |2011|13
我的查询如下所示:

SELECT
min(x.id) AS id,
week as week,
year,
COUNT(*) AS amount,
SUM(price_unit) AS price
FROM (
   SELECT
   so.id as id,
   DATE_PART('week',  so.date_order) AS week,
   DATE_PART('year',  so.date_order) AS year,
 sol.price_unit
 FROM 
sale_order AS so
INNER JOIN sale_order_line AS sol ON sol.order_id = so.id
WHERE so.date_order BETWEEN '2010-01-01' AND '2011-12-31' 
) AS x
GROUP BY
week,
year
我想做的是,减去不同年份的相同周数,得到销售额的差异。比如2011-2010周,结果应该是这样的

week|year     |difference
 1  |2011-2010|5
 2  |2011-2010|6

我只是不知道如何像那样进行减法:)

要计算两年之间的差值,请尝试以下方法:

SELECT
week as week,
'2011-2010' as year,
sum(case calcyear when 2011 then 1 else -1 end) AS amount,
sum(case calcyear when 2011 then price_unit else -1*price_unit end) AS price
FROM (
   SELECT
   so.id as id,
   DATE_PART('week',  so.date_order) AS week,
   DATE_PART('year',  so.date_order) AS calcyear,
 sol.price_unit
 FROM 
sale_order AS so
INNER JOIN sale_order_line AS sol ON sol.order_id = so.id
WHERE so.date_order BETWEEN '2010-01-01' AND '2011-12-31' 
) AS x
GROUP BY
week

如果尝试此操作,我会得到一个错误“列“calcyear”不存在”。所以我的数据库似乎不认识这样的功能?是否有其他替代方法?@tatsuo,calcyear是子查询中的一个已修改别名(因此可以在主查询中显示字符串“year”)—请检查您是否已相应地修改子查询。谢谢。现在它减去了我想要的。我还注意到一件事,我总是得到今年的最后一周(我指的是2011年),这一周还没有到来。这是函数中的错误还是数据库中的错误?因为我得到的是50周,而不是第51周,我不应该得到,但我得到的是第52周。你包括了2010年全年的数据,其中应该包括50周以后的数据。此外,请注意,
week
date\u部分返回ISO周(ISO周1不一定从一年的第一天开始)-您最好将date\u部分(“doy”)除以7。