如何使用GROUP BY作为带别名的列?

时间:2015-04-10 07:53:29

标签: sql sql-server

我有3张桌子 tblVendortblVendorItemtblEventItem

tblEventItem包含QuantityPrice列。

我想根据销售图表上显示供应商的 VendorItem ,其中销售额将按计算为column (Quantity * Price)

我尝试了以下查询,但无法正常工作。它说:Invalid column name: Sales

SELECT        tblEventItem.Quantity * tblEventItem.Price AS 'Sales', tblEventItem.VendorItemID, tblVendorItem.Name AS 'VendorItemName'
FROM            tblEventService INNER JOIN
                         tblEventItem ON tblEventService.EventServiceID = tblEventItem.EventServiceID INNER JOIN
                         tblVendorItem ON tblVendorItem.VendorItemID = tblEventItem.VendorItemID INNER JOIN
                         tblVendor ON tblVendorItem.VendorID = tblVendor.VendorID
WHERE        (tblEventService.ServiceID = 3)
GROUP BY 'Sales'

2 个答案:

答案 0 :(得分:1)

使用CROSS APPLY或OUTER APPLY。这不会影响性能,但它使代码更易读,更易于使用。

-- MS SQL
CREATE TABLE #test
(
    b INT, 
    c INT
);

INSERT INTO #test VALUES (1,2), (2,3), (3,4), (4,3)

SELECT s.Sales, COUNT(*)  FROM #test a CROSS APPLY  (SELECT b*c AS 'Sales') s
GROUP BY s.Sales;

在你的情况下,它将是:

SELECT
    s.Sales ,
    tblEventItem.VendorItemID ,
    tblVendorItem.Name AS 'VendorItemName'
FROM
    tblEventService
    INNER JOIN tblEventItem ON tblEventService.EventServiceID = tblEventItem.EventServiceID
    INNER JOIN tblVendorItem ON tblVendorItem.VendorItemID = tblEventItem.VendorItemID
    INNER JOIN tblVendor ON tblVendorItem.VendorID = tblVendor.VendorID
    CROSS APPLY (SELECT tblEventItem.Quantity * tblEventItem.Price Sales)  s
WHERE
    ( tblEventService.ServiceID = 3 )
ORDER BY
    'Sales' DESC;

目前尚不清楚需要分组的内容,但希望通过此查询,您可以制定计划。

答案 1 :(得分:0)

SELECT        tblVendorItem.Name, tblEventItem.Quantity * tblEventItem.Price AS 'Sale'
FROM            tblEventService INNER JOIN
                         tblEventItem ON tblEventService.EventServiceID = tblEventItem.EventServiceID INNER JOIN
                         tblVendorItem ON tblEventItem.VendorItemID = tblVendorItem.VendorItemID INNER JOIN
                         tblVendor ON tblVendorItem.VendorID = tblVendor.VendorID
WHERE        (tblEventService.VendorID =@VendorID)
             GROUP BY  tblVendorItem.Name,tblEventItem.Quantity, tblEventItem.Price