编写SQL查询2020、2021年发票总和并计算2021年发票金额增长率
SQL修改方案
你需要先分别统计2020、2021年各自的发票总金额,再代入增长率公式计算即可,修改后的代码如下,同时修正了你原SQL中关联字段拼写错误的问题:
SELECT -- 分别统计两年总金额 SUM(CASE WHEN YEAR(dbo.Invoice.InvoiceDate) = 2020 THEN UnitPrice * UnitQuantity ELSE 0 END) AS total_2020, SUM(CASE WHEN YEAR(dbo.Invoice.InvoiceDate) = 2021 THEN UnitPrice * UnitQuantity ELSE 0 END) AS total_2021, -- 计算增长率,乘以100可直接得到百分比数值,NULLIF避免除以0报错 (SUM(CASE WHEN YEAR(dbo.Invoice.InvoiceDate) = 2021 THEN UnitPrice * UnitQuantity ELSE 0 END) - SUM(CASE WHEN YEAR(dbo.Invoice.InvoiceDate) = 2020 THEN UnitPrice * UnitQuantity ELSE 0 END)) * 100.0 / NULLIF(SUM(CASE WHEN YEAR(dbo.Invoice.InvoiceDate) = 2020 THEN UnitPrice * UnitQuantity ELSE 0 END), 0) AS growth_rate_2021 FROM dbo.Invoicelineitem INNER JOIN -- 原LEFT JOIN配合WHERE过滤Invoice字段实际等价于INNER JOIN,这里直接写更清晰 dbo.Invoice ON dbo.Invoicelineitem.InvoiceKey = dbo.Invoice.InvoiceKey WHERE YEAR(dbo.Invoice.InvoiceDate) IN (2020, 2021); -- 用YEAR函数比LIKE兼容性更好,适合日期类型字段
补充说明
- 如果你使用的数据库不支持
YEAR()函数,也可以把WHERE条件换回原来的InvoiceDate LIKE '2020%' OR InvoiceDate LIKE '2021%'写法,条件聚合里的判断也对应换成InvoiceDate LIKE '2020%'即可 growth_rate_2021字段的结果就是2021年对比2020年的增长率,比如结果为15就是同比增长15%,结果为负就是同比下降- 如果需要展示为带百分号的字符串,可以根据你使用的数据库调用对应的格式化函数处理即可
内容的提问来源于stack exchange,提问作者Asad Bin Zaman
相关产品推荐
相关产品推荐

