SQL: 如何 return 特定年份的收入

SQL: How to return revenue for specific year

我想为所有客户显示特定年份的收入,无论他们是否有特定年份的收入数据。 (如果他们没有特定年份的数据,则可以使用 'no data' 之类的填充符)

示例数据如下:

Table 1

Customer Price Quantity Order Date
xxx 12 5 1990/03/25
yyy 15 7 1991/05/35
xxx 34 2 1990/08/21

所需的输出看起来有点像这样:

Customer Revenue (for 1990)
xxx 128
yyy no data

获得每项的总收入为:
SELECT 客户,

SUM(数量*价格) AS 收入

但我如何为所有客户列出特定年份的产品? (包括没有特定年份数据的客户)

我们可以使用 CTE 或 sub-query 来创建所有客户的列表,并使用另一个来获取所有年份并将它们交叉连接并左连接到收入上。 这为每年的每个客户提供了一行。如果你添加 where y= 你将只会得到请求的年份。

CREATE TABLE revenue(
Customer varchar(10),
Price int,
Quantity int,
OrderDate date);
insert into revenue values
('xxx',   12,5,'2021-03-25'),
('yyy',   15,7,'2021-05-15'),
('xxx',   34,2,'2022-08-21');
with cust as 
(select distinct customer c from revenue),
years as
(select distinct year(OrderDate) y from revenue)
select 
y "year",
c customer ,
sum(price*quantity) revenue
from years 
cross join cust 
left join revenue r
on cust.c = r.customer and years.y = year(OrderDate)
group by 
c,y,
year(OrderDate)
order by y,c
year | customer | revenue
---: | :------- | ------:
2021 | xxx      |      60
2021 | yyy      |     105
2022 | xxx      |      68
2022 | yyy      |    null

db<>fiddle here

您只需使用 group by 并在子查询中进行求和,然后将其加入您的客户 table。即:

select customers.Name, totals.Revenue
from Customers
Left join 
( select customerId, sum(quantity*price) as revenue
  from myTable
  where year(orderDate) = 1990
  group by customer) totals on customers.CustomerId = myTable.customerId;