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;
我想为所有客户显示特定年份的收入,无论他们是否有特定年份的收入数据。 (如果他们没有特定年份的数据,则可以使用 '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;