Я хотел бы получить следующий результат из таблицы ниже: Для каждого клиента возвращенные счета будут удалены из приобретенных счетов. Например, если куплен один продукт и за него возвращен возврат средств, обе строки (счета-фактуры) будут удалены. Однако если 2 продукта приобретены в одном счете-фактуре и один из них возвращен, из таблицы будет удален только счет-фактура с возвратом средств путем вычета суммы возврата и дохода (счет-фактура возврата) из счета-фактуры, содержащего информацию об этих двух продуктах. Я пометил купленные счета и счета за возврат средств одним и тем же цветом.
IsReturn=1: возможен возврат средств. IsReturn=0: возврат средств невозможен. ItemCode: код продукта ColorCode: цвет продукта. ItemDim1Code: размер продукта. Qty: количество приобретенного товара
Я также добавил те же данные, что и в таблицу ниже:
В конце концов я хотел бы получить результат, подобный следующему:
Пожалуйста, не используйте изображения... Используйте уценку таблицы.
Является ли ApplicationID способом связать счет и возврат? Я бы, вероятно, присоединился к счету-фактуре с агрегированным количеством возвратов и проверил, является ли SUM (возвращенная сумма) >= сумма счета-фактуры, и либо скорректировал его, либо вообще удалил строку. Это может оказаться интересным, если у вас нет хорошей системы возврата, которая бы правильно соответствовала продуктам и т. д.
Я подозреваю, что у вас слишком сложный пример. Вероятно, вы можете удалить столбцы CustomerCode, InvoiceNumber, InvoiceDate, ColorCode и ItemDim1Code и получить то же логическое решение.
WITH n AS (
SELECT CustomerCode, ApplicationID, ItemCode, ColorCode, ItemDim1Code, SUM (Qty) Qty, SUM (Revenue) Revenue
FROM sales_data
GROUP BY CustomerCode, ApplicationID, ItemCode, ColorCode, ItemDim1Code
HAVING SUM(qty) > 0
)
SELECT n.CustomerCode, s.InvoiceNumber, s.IsReturn, s.InvoiceDate, n.ApplicationID, n.ItemCode, n.ColorCode, n.ItemDim1Code, n.Qty, n.Revenue
FROM n
JOIN sales_data s
ON ( s.CustomerCode = n.CustomerCode
AND s.ApplicationID = n.ApplicationID
AND s.ItemCode = n.ItemCode
AND s.ColorCode = n.ColorCode
AND s.ItemDim1Code = n.ItemDim1Code
AND s.IsReturn = FALSE
);
Спасибо, но это идет в строках с is.Return=1
@burga.varol. изменено с учетом необходимости
хорошая перспектива. спасибо, это сработало
При наличии возврата требуется перерасчет количества и дохода для каждой группы CustomerCode, ItemCode, ApplicationID. Таблица sales_data имеет 17 строк. 4 строки будут удалены из-за простого возврата именно того, что было куплено (идентификатор приложения заканчивается на 036 и 001). 2 строки удалены из-за частичного возврата (идентификатор приложения заканчивается на E7F и 621). Окончательные результаты будут иметь 11 строк. Это можно упростить, если ApplicationID однозначно идентифицирует покупку или возврат товара.
WITH ReturnedItems AS
(
--Items that have been returned
SELECT CustomerCode,ItemCode,ApplicationID, SUM(cast(qty as int)) as NewQty,
Sum(Revenue) as NewRevenue
FROM sales_data
GROUP BY CustomerCode,ItemCode,ApplicationID
HAVING MAX(IsReturn)=1
)
SELECT s.CustomerCode,
s.InvoiceNumber,
s.IsReturn,
s.InvoiceDate,
s.ApplicationID,
s.ItemCode,
s.ColorCode,
s.ItemDim1Code,
Isnull(r.NewQty, s.Qty) as QTY,
ISNULL(r.NewRevenue,s.Revenue) as Revenue
FROM sales_data s
LEFT JOIN ReturnedItems r ON r.CustomerCode=s.CustomerCode
and r.ItemCode=s.ItemCode
and r.ApplicationID=s.ApplicationID
WHERE IsReturn=0 AND (r.NewQty<>0 or r.NewQty IS NULL )
Большое спасибо. Мне удалось получить желаемый результат.
Пожалуйста, отметьте только одну rdbms