我正在尝试使用别名OriginalCost和QuantityDiscount来进行一些计算。我知道你只能在GROUP BY,HAVING或ORDER BY中使用别名,但我不确定如何以正确的方式做到这一点。我用这段代码得到的错误是
第9行 列名称'QuantityDiscount'无效。
SELECT Orders.Orderid, Inventory.partid, Description, Qty, (Inventory.price) AS UnitPrice,
(OrderItems.Qty * Inventory.price) AS OriginalCost,
CASE
WHEN OrderItems.Qty >= 5 THEN (OriginalCost) * .05)
WHEN OrderItems.Qty >= 10 THEN (OriginalCost) * .10)
ELSE 0
END AS QuantityDiscount,
SUM(OriginalCost - QuantityDiscount) AS FinalCost
FROM Orders
JOIN OrderItems ON OrderItems.orderid = OrderItems.orderid
JOIN Inventory ON ORDERITEMS.partid = Inventory.partid
ORDER BY QTY DESC
答案 0 :(得分:1)
因此,您可以通过以下方式定义别名:
SELECT Alias = TableAlias.Field --prefixed to a field
,TableAlias.Field as OtherAlias --at the end of a field
FROM Table TableAlias --on a table
--then use by anything that is caculated after that part in the order of operations.
ORDER BY Alias;
然后您可以在定义它们的区域后使用它们。
SQL操作顺序:
答案 1 :(得分:1)
您没有提供任何样本数据,因此未经测试:
SELECT
t.OrderID,
t.PartID,
t.Description,
t.Qty,
t.UnitPrice,
t.OriginalCost,
t.QuantityDiscount,
SUM(t.OriginalCost - t.QuantityDiscount) AS FinalCost
FROM (
SELECT
Orders.Orderid,
Inventory.partid,
Description,
Qty,
(Inventory.price) AS UnitPrice,
(OrderItems.Qty * Inventory.price) AS OriginalCost,
CASE
WHEN OrderItems.Qty >= 5 THEN (OrderItems.Qty * Inventory.Price) * .05)
WHEN OrderItems.Qty >= 10 THEN (OrderItems.Qty * Inventory.Price) * .10)
ELSE 0
END AS QuantityDiscount
FROM
Orders
JOIN
OrderItems ON OrderItems.orderid = OrderItems.orderid
JOIN
Inventory ON ORDERITEMS.partid = Inventory.partid
) AS t
ORDER BY QTY DESC
答案 2 :(得分:0)
您不能使用在同一select语句中定义的别名。您将不得不使用子查询或表表达式。
这样的事情(代码没有经过测试,只是为了给你一个想法)
SELECT *
,SUM(t2.OriginalCost - t2.QuantityDiscount) AS FinalCost
FROM
( SELECT *
,CASE WHEN t1.Qty >= 5 THEN (t1.OriginalCost * .05) WHEN t1.Qty >= 10 THEN (t1.OriginalCost * .10) ELSE 0 END AS QuantityDiscount
FROM
( SELECT Orders.Orderid,
Inventory.partid,
Description,
Qty,
(Inventory.price) AS UnitPrice,
(OrderItems.Qty * Inventory.price) AS OriginalCost
FROM Orders
JOIN OrderItems ON OrderItems.orderid = OrderItems.orderid
JOIN Inventory ON ORDERITEMS.partid = Inventory.partid
) AS t1
) AS t2
ORDER BY QTY DESC
答案 3 :(得分:0)
请改为尝试:
SELECT
Orderid,
partid,
Description,
Qty,
UnitPrice,
OriginalCost,
QuantityDiscount,
OriginalCost - QuantityDiscount AS FinalCost
FROM (
SELECT
Orders.Orderid, Inventory.partid, Description, Qty,
Inventory.price AS UnitPrice,
(OrderItems.Qty * Inventory.price) AS OriginalCost,
CASE
WHEN OrderItems.Qty >= 5 THEN (OriginalCost) * .05)
WHEN OrderItems.Qty >= 10 THEN (OriginalCost) * .10)
ELSE 0
END AS QuantityDiscount
FROM Orders
) T
JOIN OrderItems ON OrderItems.orderid = OrderItems.orderid
JOIN Inventory ON ORDERITEMS.partid = Inventory.partid
ORDER BY QTY DESC
如果此时仍需要amy聚合,请将此查询包围另一个查询作为子查询。