Как я мог бы объединить эти 3 инструкции T-SQL в одну?

#sql #database #tsql

#sql #База данных #tsql

Вопрос:

У меня есть 3 запроса, которые я хочу объединить. 1 запрос для общего объема продаж, 1 для отмененных заказов и 1 для заказов, которые не включают определенные типы продуктов. Просто нужно, чтобы общие продажи $ $ выводились в табличном формате, как сейчас. Единственное, что меняется между 3-мя, — это оператор where. Спасибо!

Редактировать: я понимаю, что я сказал «Просто нужен общий объем продаж $ $»… я имел в виду, что мне просто нужны sales $ $ для каждого запроса в одной таблице. Итак, $ x, $ y, $ z … x — это общий объем продаж, y — это отмененные доллары продаж, а z — это доллары продаж для конкретных товаров.

 SELECT Sum((Items.Total Items.Shipping)*OrderDetails.Quantity) AS Total
FROM Promo INNER JOIN (Orders INNER JOIN (Items INNER JOIN OrderDetails ON Items.ItemCode = OrderDetails.ItemCode) ON Orders.OrderNumber = OrderDetails.OrderNumber) ON Promo.Promo = Orders.Promo
WHERE ((Promo.OfferType)='Sale') AND ((Items.Date) Between '6/1/2010' And '12/31/2011');

SELECT Sum((Items.Total Items.Shipping)*OrderDetails.Quantity) AS Canceled
FROM Promo INNER JOIN (Orders INNER JOIN (Items INNER JOIN OrderDetails ON Items.ItemCode = OrderDetails.ItemCode) ON Orders.OrderNumber = OrderDetails.OrderNumber) ON Promo.Promo = Orders.Promo
WHERE (((Promo.OfferType)='Sale') AND ((Items.Date) Between '6/1/2010' And '12/31/2011') AND ((Items.Status)="Canceled"));

SELECT Sum((Items.Total Items.Shipping)*OrderDetails.Quantity) AS BadItems
FROM Promo INNER JOIN (Orders INNER JOIN (Items INNER JOIN OrderDetails ON Items.ItemCode = OrderDetails.ItemCode) ON Orders.OrderNumber = OrderDetails.OrderNumber) ON Promo.Promo = Orders.Promo
WHERE (((Promo.OfferType)='Sale') AND ((Items.Date) Between '6/1/2010' And '12/31/2011') AND ((Items.ProductType)<>2) AND ((Items.ProductType)<>6));
  

Спасибо!

Ответ №1:

Если вы хотите получить результаты в 1 строке:

 SELECT Total, Canceled, BadItems
FROM Query1, Query2, Query3
  

И если вы хотите получить результаты в 1 столбце, используйте UNION :

 Query1
UNION
Query2
UNION
Query3
  

Ответ №2:

Обновлено, чтобы отразить разъяснение вопроса:

 SELECT Sum(CASE WHEN Items.Status <> 'Canceled' AND Items.ProductType = 4 THEN (Items.Total Items.Shipping)*OrderDetails.Quantity ELSE 0 END) AS Total ,
       Sum(CASE WHEN Items.Status = 'Canceled' AND Items.ProductType = 4 THEN (Items.Total Items.Shipping)*OrderDetails.Quantity ELSE 0 END) AS Canceled,
       Sum(CASE WHEN Items.ProductType <> 4 THEN (Items.Total Items.Shipping)*OrderDetails.Quantity ELSE 0 END) AS BadItems,
FROM Promo INNER JOIN (Orders INNER JOIN (Items INNER JOIN OrderDetails ON Items.ItemCode = OrderDetails.ItemCode) ON Orders.OrderNumber = OrderDetails.OrderNumber) ON Promo.Promo = Orders.Promo
WHERE ((Promo.OfferType)='Sale') AND ((Items.Date) Between '9/1/2010' And '12/31/2010');
  

Комментарии:

1. Внес правку, мне было неясно, чего я хотел. Я хочу, чтобы все 3 значения были в одной таблице… таким образом, необходимо объединить 3 запроса, чтобы предоставить все 3 значения.

Ответ №3:

попробуйте использовать процедуру, которая будет принимать три значения в качестве входных данных, которые будут соответствовать вашим операторам were, и это даст результаты в одной таблице, как хотите. если вы застряли, дайте мне знать, я помогу.