【问题标题】:Aggregate function within table I'm creating我正在创建的表中的聚合函数
【发布时间】:2013-05-16 20:53:40
【问题描述】:

我有一个数据集,其中有一个 ItemID,然后按每个价格出售的数量如下:

ItemID  |  Quantity  |  Price
ABC        10           14.50
ABC        4            14.25
DEF        32           22.41
ABC        24           14.10
GHI        8            8.50
GHI        12           8.60
DEF        2            22.30

每个条目都有唯一的 ItemID 和 Price 组合。我想添加第四列,其中包含该 ItemID 的总销售量。所以上表看起来像这样:

ItemID  |  Quantity  |  Price  |  TotalQ
ABC        10           14.50     38
ABC        4            14.25     38
DEF        32           22.41     34
ABC        24           14.10     38
GHI        8            8.50      20
GHI        12           8.60      20
DEF        2            22.30     34

如果不对聚合函数执行聚合函数,我似乎无法执行此操作,这显然会产生错误。我将如何实现这一目标?

我使用的是 SQL Server 2008。

【问题讨论】:

  • 您如何知道 TotalQ?您可以编写一个函数来计算 TotalQ。
  • 这听起来正是我要找的。我对 SQL 很陌生,所以我真的不知道如何编写这样的函数。

标签: sql sql-server


【解决方案1】:

请尝试:

SELECT 
    *, 
    SUM(Quantity) OVER(PARTITION BY ItemID) TotalQ
FROM 
    YourTable

【讨论】:

  • 得到错误:消息 8120,级别 16,状态 1,第 24 行列 'server.Quantity' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中.
  • @weskpga - 如果您在另一个已经按ItemID,Price 分组的查询的上下文中使用它,您可能需要SUM(SUM([Quantity])) OVER (PARTITION BY [ItemID]) AS TotalQ。最好向我们展示原始查询,而不仅仅是结果。
【解决方案2】:

试试这个代码

select a.ItemID,a.Quantity,a.Price,x.Total form table_name a
left outer join 
(select sum(Quantity) Total, ItemID from table_name group by ItemID)x
on x.ItemID = a.ItemID

【讨论】:

    【解决方案3】:

    如果您只在查询中需要这个,您可以编写如下内容:

    ;WITH CTE_Total AS
    (
        SELECT ItemID, SUM(Quantity) as TotalQ
        FROM YourTable
        GROUP BY ItemID
    )
    SELECT t.*, c.TotalQ
    FROM YourTable t
    LEFT JOIN CTE_Total c on t.ItemID = c.ItemID
    

    SQLFiddle DEMO

    但是,如果您想在表中自动计算列,首先您需要创建执行计算的函数:

    CREATE FUNCTION dbo.fn_YourTableTotalQ (@ItemID VARCHAR(3))
    RETURNS Int
    AS
    BEGIN
       DECLARE @toRet INT
    
       SELECT @toRet = COALESCE(SUM(Quantity),0)
       FROM YourTable WHERE ItemID = @ItemID
    
       RETURN @toRet
    END
    

    ...然后添加使用此函数计算的新列:

    ALTER TABLE YourTable
    ADD TotalQ AS dbo.fn_YourTableTotalQ(ItemID)
    

    SQLFiddle DEMO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 2017-04-09
      • 2013-01-31
      • 2012-06-20
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多