Sql 如何减去列中有一个匹配值的两行
我在比较不同年份同一周的销售额。比如2010年和2011年的第一周。因此,通过我的查询,我得到了这样的结果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
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。