2013-03-19 59 views
2

这个查询适合我。只有一个表达式可以在选择列表中指定。在sql查询

SELECT (SUM(AveragePrice)/COUNT(1)) AS AveragePrice, SUM(ItemsSold) AS ItemSold ,(SUM(AveragePrice * ItemsSold)) AS TotalSale FROM dbo.tbl_ProductSales 
WHERE ProductID IN (SELECT ProductID FROM tbl_ProductPostions WHERE tbl_ProductPostions.SearchID=3 AND SaleDate='2012-02-02 00:00:00.000') 
GROUP BY SaleDate 

和resuts这样
AveragePrice | ItemSold | TotalSale

10 | 2 | 2000

但是当我嵌入此查询这样

SELECT * ,(SELECT (SUM(AveragePrice)/COUNT(1)) AS AveragePrice, SUM(ItemsSold) AS ItemSold ,(SUM(AveragePrice * ItemsSold)) AS TotalSale FROM dbo.tbl_ProductSales 
WHERE ProductID IN (SELECT ProductID FROM tbl_ProductPostions WHERE tbl_ProductPostions.SearchID=tbl_SearchParameters.SearchID AND SaleDate='2012-02-02 00:00:00.000') 
GROUP BY SaleDate) 
FROM tbl_SearchParameters 

我得到了这样的错误。 当子查询未与EXISTS一起引入时,只能在选择列表中指定一个表达式。

我知道我正在超越极限,但有没有其他方法可以做到这一点。 我知道可以创建该功能来完成这项任务。但对于分别创建 三个函数来计算这些总计平均价格,卖出的商品,总销售量是必不可少的? 虽然我确定一个查询可以为我计算三个聚合? 任何机构可以建议我适当的解决方案?我只想分别为这些聚合分别创建三个函数。 此致敬礼。

回答

1

您可以使用APPLY()操作

SELECT * 
FROM tbl_SearchParameters p 
    CROSS APPLY (
       SELECT SUM(AveragePrice/COUNT(1)) AS AveragePrice, 
         SUM(ItemsSold) AS ItemSold,    
         SUM(AveragePrice * ItemsSold) AS TotalSale 
       FROM dbo.tbl_ProductSales 
       WHERE ProductID IN (SELECT ProductID 
            FROM tbl_ProductPostions 
            WHERE tbl_ProductPostions.SearchID = p.SearchID   
            AND SaleDate='2012-02-02 00:00:00.000') 
       GROUP BY SaleDate 
       ) o 
0

尝试删除第二个选择,如:

SELECT * ,(SUM(AveragePrice)/COUNT(1)) AS AveragePrice, 
      SUM(ItemsSold) AS ItemSold , 
      (SUM(AveragePrice * ItemsSold)) AS TotalSale 
FROM dbo.tbl_ProductSales 
WHERE ProductID IN (SELECT ProductID 
        FROM tbl_ProductPostions 
        WHERE tbl_ProductPostions.SearchID=tbl_SearchParameters.SearchID 
        AND SaleDate='2012-02-02 00:00:00.000') 
GROUP BY SaleDate) 
FROM tbl_SearchParameters 
相关问题