Я пытаюсь создать запрос, который вернет сообщение, если в заказе больше заказанных продуктов, чем в наличии, но у него есть дубликаты, и я не могу понять, почему. Смотрите скриншот ниже: введите описание изображения здесь
Запрос:
SELECT a.OrderID, a.CustomerID,
(SELECT SUM(Subtotal) from [Order Subtotals] AS f
where a.OrderID = f.OrderID) as Total,
(Select SUM(Quantity) as Quantity from dbo.[Order Details Extended] b
where a.OrderID = b.OrderID) as Quantity,
( SELECT
CASE
WHEN Quantity > d.UnitsInStock or Discontinued = 1
THEN 'error in order'
ELSE ''
END AS varchar) as Messagee
FROM dbo.Orders AS a
Left join [Order Details Extended] as c on a.OrderID = c.OrderID
Left join Products as d on c.ProductID = d.ProductID
Какого результата вы хотите, когда есть и "ошибки по порядку", и нет? Либо пропустите этот столбец и выполните SELECT DISTINCT. Или сделайте GROUP BY, чтобы выбрать свой выбор.
если есть и «ошибка в порядке», и пустое сообщение, оно должно возвращать только «ошибка в порядке». Если я добавлю «Выбрать отдельный случай», он все равно вернет оба.
Затем сделайте GROUP BY!
Группировать по чему? Невозможно сгруппировать по сообщениям, потому что это недопустимый столбец.
GROUP BY по другим выбранным столбцам. Сделайте MAX (сообщение) в списке выбора.
Можете ли вы привести пример того, как будет выглядеть MAX в messagee?


Правильный запрос:
SELECT a.OrderID, a.CustomerID, sum(os.subtotal) as Total,
SUM(ode.Quantity) as quantity,
CASE WHEN COUNT(
CASE WHEN Quantity > pro.UnitsInStock OR Discontinued = 1 THEN 1 END
) > 0 THEN 'error in order' ELSE '' END AS Message
from dbo.Orders as a
Left join [Order Details Extended] as ode
on a.OrderID = ode.OrderID
Left join Products as pro
on ode.ProductID = pro.ProductID
left join [Order Subtotals] as os
on a.OrderID = os.OrderID
group by a.OrderID, a.CustomerID
Distinct по-прежнему будет возвращать дубликаты, например, если один orderid отображается три раза, а два из них имеют пустые сообщения, тогда отличное удаление одного из них, но по-прежнему будет отображать другое + сообщение с сообщением об ошибке.