如何正确使用别名

时间:2013-04-13 01:09:13

标签: sql sql-server-2008

我正在尝试使用别名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

4 个答案:

答案 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. FROM clause
  2. WHERE子句
  3. GROUP BY子句
  4. HAVING条款
  5. SELECT条款
  6. ORDER BY子句

答案 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聚合,请将此查询包围另一个查询作为子查询。