我需要导出自 2022 年以来客户的发票姓名和总和。因此我只需要获取 2 年来购买的客户和总和。
没问题:
select i.customer_id, sum(amount)
from invoices i
inner join customer c2 on c2.customer_id = i.customer_id
where i.invoice_date > '01/12/2022'
group by i.customer_id , c2.customer_id
id | 名字 | 总和 |
---|---|---|
2 | 约翰逊 | 300 |
3 | 阿里 | 100 |
我今年需要在同一个出口中让客户修改
我使用这个查询
select c.customer_id, c.name, '' from customer c
where c.modificationDate > '01/12/2024'
group by c.customer_id , c.name
id | 名字 | |
---|---|---|
1 | 史密斯 | |
3 | 阿里 |
因为我需要在同一个导出中使用它,所以我使用 UNION
select i.customer_id, c2.name , sum(amount) sum from invoices i
inner join customer c2 on c2.customer_id =i.customer_id
where i.invoice_date > '01/12/2022'
group by i.customer_id , c2.customer_id , c2.name
union
select c.customer_id, c.name, '' from customer c
where c.modificationDate > '01/12/2024'
group by c.customer_id , c.name
id | 名字 | 总和 |
---|---|---|
1 | 史密斯 | 0.0000 |
2 | 约翰逊 | 300.0000 |
3 | 阿里 | 0.0000 |
3 | 阿里 | 100.0000 |
我的问题是我希望 ALI 先生在我的结果中只出现一次,即
id | 名字 | 总和 |
---|---|---|
1 | 史密斯 | 0.0000 |
2 | 约翰逊 | 300.0000 |
3 | 阿里 | 100.0000 |
我怎样才能做到这一点?
先执行并集,然后应用 GROUP BY。对于修改的记录,暴露 0 作为金额。
SELECT t.customer_id , t.name, sum(t.amount) AS sum
FROM
(
--customers invoiced since 01/12/2022
SELECT i.customer_id, c2.name, i.amount
FROM invoices i
INNER JOIN customer c2 ON c2.customer_id =i.customer_id
WHERE i.invoice_date > '01/12/2022'
UNION
--customers modified since 01/12/2024
SELECT c.customer_id, c.name, 0 AS amount
FROM customer c
WHERE c.modificationDate > '01/12/2024'
) t
GROUP BY t.customer_id , t.name
ORDER BY t.Customer_ID
客户 ID | 名字 | 总和 |
---|---|---|
1 | 史密斯 | 0.0000 |
2 | 约翰逊 | 300.0000 |
3 | 阿里 | 100.0000 |
不需要 UNION。当 i.invoice_date > '01/12/2022' 时,您可以使用 1 SELECT 和 Amount 的 SUM,否则 SUM 0。在此解决方案中,查询必须从客户表开始,并且需要通过 LEFT JOIN 添加发票表。
SELECT c.customer_id, c.name, SUM(CASE WHEN i.invoice_date > '01/12/2022' THEN i.amount ELSE 0 END) as Sum
FROM customer c
LEFT JOIN invoices i ON c.customer_id =i.customer_id
WHERE i.invoice_date > '01/12/2022' OR c.modificationDate > '01/12/2024'
GROUP BY c.customer_id, c.name
ORDER BY c.Customer_ID