Объединение нескольких SQL-запросов в один результат

#sql-server

Вопрос:

Я пытаюсь собрать результат 2 запросов в один результирующий набор. Я использую SQL Server 2019 Express.

Вот данные, с которыми я работаю:

Стол Sales

Распродажа Распродажа Идентификатор клиента
11/1/2021 500 123
11/1/2021 100 234
11/1/2021 300 345
11/2/2021 500 456
11/2/2021 100 567
11/2/2021 200 678

Стол Customers

Идентификатор клиента Имя пользователя
123 Джон Доу
234 Джейн Доу
456 Боб Доу
678 Джим Доу

Запрос № 1:

 select sales.saledate, sum(sales.saleamt) as 'Total Sales from All'  from Sales  group by sales.saledate  

Запрос № 2:

 select sales.saledate, sum(sales.saleamt) as 'Total Sales from Customers' from Sales  where sales.customerid in (select customerid from customers)  group by sales.saledate  

Это мой желаемый результат:

Распродажа Общий объем продаж от всех Общий объем продаж от Клиентов
11/1/2021 900 600
11/2/2021 800 700

Ответ №1:

вы можете использовать присоединиться в день продажи

 select s1.saledate, All_Total AS 'Total Sales from All', CustomersTotal as 'Total Sales from Customers' from (  select sales.saledate, sum(sales.saleamt) as All_Total  from Sales  group by sales.saledate  ) s1  inner join  (  select sales.saledate, sum(sales.saleamt) as CustomersTotal  from Sales  where sales.customerid in (select customerid from customers)  group by sales.saledate  ) s2 on s1.saledate = s2.saledate  

Ответ №2:

вы можете объединить его в один запрос с помощью case выражения.

 select s.saledate,   sum(s.saleamt) as [Total Sales from All],  sum(case when exists   (  select *   from customers c   where c.customerid = s.customerid   )   then s.salesamt   end) as [Total Sales from Customers] from Sales s group by s.saledate  

Ответ №3:

Вы можете использовать a LEFT JOIN с условной агрегацией

 select  s.saledate,  sum(s.saleamt) as [Total Sales from All],  sum(case when c.customerid is not null then s.saleamt end) as [Total Sales from Customers] from Sales s left join customers c on s.customerid = c.customerid group by s.saledate;