Я действительно не знаю, что я делаю с SQL, но у меня есть две таблицы.Я знаю, что вы можете извлечь данные из одной таблицы и добавить их в другую таблицу, если столбцы эквивалентны.Итак, я хотел что-то вроде:
SELECT Sum(OrderDetails.Vendor_Price * OrderDetails.Quantity)
WHERE Orders.OrderID=OrderDetails.OrderID
AS COGS
По сути, таблица orders и orderdetails - это две отдельные таблицы, но orderdetails имеет элемент OrderID, который связывает его с заказом в таблице orders.Так что моя функция - это где Orders.OrderID = OrderDetails.OrderID, то есть где реализовать сумму, я хочу ее для каждого заказа.Мне удалось найти пример кода, который выполняет эту задачу с большим количеством избыточного кода:
SELECT orders.orderid,
orders.cogs
FROM (SELECT orders.orderid,
orderdetails.cogs
FROM (SELECT orders.orderid AS orderid
FROM (((orders WITH(nolock)
LEFT JOIN paymentmethods WITH(nolock)
ON orders.paymentmethodid =
paymentmethods.paymentmethodid)
LEFT JOIN shippingmethods WITH(nolock)
ON orders.shippingmethodid =
shippingmethods.shippingmethodid)
LEFT JOIN customers WITH(nolock)
ON orders.customerid = customers.customerid)
GROUP BY orders.orderid) orders
INNER JOIN (SELECT
orders.orderid
AS orderid,
COUNT(orderdetails.orderdetailid)
AS
orderdetails_count
,
SUM(orderdetails.quantity)
AS quantity,
SUM(orderdetails.vendor_price *
orderdetails.quantity) AS
cogs,
CASE
WHEN SUM(vendor_price) IS NULL THEN NULL
ELSE SUM(( CASE
WHEN orderdetails.productcode
LIKE
'DSC-%'
THEN
orderdetails.productprice
- Isnull(
orderdetails.vendor_price, 0)
ELSE orderdetails.productprice
-
orderdetails.vendor_price
END ) * orderdetails.quantity)
END
AS
profit,
CASE SUM(orderdetails.productprice *
orderdetails.quantity)
WHEN 0 THEN 0
ELSE Round(( ( SUM(orderdetails.productprice
*
orderdetails.quantity)
- SUM(
orderdetails.vendor_price *
orderdetails.quantity) ) /
SUM(
orderdetails.productprice
*
orderdetails.quantity) )
* 100,
1)
END
AS
profitmargin
FROM (((orders WITH(nolock)
LEFT JOIN paymentmethods WITH(nolock)
ON orders.paymentmethodid =
paymentmethods.paymentmethodid)
LEFT JOIN shippingmethods WITH(nolock)
ON orders.shippingmethodid =
shippingmethods.shippingmethodid)
LEFT JOIN customers WITH(nolock)
ON orders.customerid = customers.customerid)
LEFT JOIN orderdetails WITH(nolock)
ON orders.orderid = orderdetails.orderid
WHERE orders.orderstatus <> 'Cancelled'
GROUP BY orders.orderid) orderdetails
ON orders.orderid = orderdetails.orderid) orders
ORDER BY orders.orderid DESC
Это в основном доставляет заказы и их COGS для каждого заказа в таблицу.Но каждый раз, когда я пытаюсь удалить строку лишнего кода, я получаю сообщение об ошибке.Такие вещи, как ShippingMethodID, не нужны.Пожалуйста, помогите.
РЕДАКТИРОВАТЬ:
ВЫБРАТЬ Orders.OrderID, Orders.SalesRep_CustomerID, Orders.Total_Payment_Received, Orders.SalesTax1, SumDetails.COGS, ISNULL (Total_Shipping_Cost.Shipping_Cost, 0), Cost)*
ОТ заказов
ПРИСОЕДИНЯЙТЕСЬ
(ВЫБЕРИТЕ OrderID, Сумма (OrderDetails.Vendor_Price * OrderDetails.Quantity)
КАК COGS
ИЗ OrderDetails
GROUP BY OrderID)
AS SumDetails
ON SumDetails.OrderID = Orders.OrderID ВЛЕВО
JOIN
(ВЫБЕРИТЬ OrderID, SUM(Shipment_Cost)
AS Shipping_Cost
ОТ номеров отслеживания
GROUP BY OrderID)
AS Total_Shipping_Cost
(ВЫБЕРИТЕ СЛУЧАЙ
КОГДА Orders.ShippingMethodID
in (19, 20, 21, 25, 26, 27, 28, 30, 31, 502)
THEN 5
ELSE 0
END)
AS ServiceCharge
ON Total_Shipping_Cost.OrderID = Orders.OrderID
ГДЕ Orders.OrderStatus = 'Shipped'
AND Orders.ShipDate> (GETDATE () - 6)
AND Orders.PaymentAmount = Orders.Total_Payment_Received