“联合”以避免重复

问题描述 投票:0回答:2

https://dbfiddle.uk/zspUa8WK

我需要导出自 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

我怎样才能做到这一点?

sql sql-server union
2个回答
1
投票

先执行并集,然后应用 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

0
投票

不需要 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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.