【问题标题】:SQL: Compare order by location to average of all ordersSQL:按位置比较订单与所有订单的平均值
【发布时间】:2014-12-02 17:34:13
【问题描述】:

我正在尝试显示每个位置的平均订单金额,并显示有多少订单的该位置的值大于所有位置的平均值。我尝试使用子查询进行比较并得到“无法对包含聚合或子查询的表达式执行聚合函数”。好的,那么我可以通过子查询进行外部应用并进行比较,但它不会绑定值。我无法弄清楚,可以使用一些帮助。这是我的最新查询:

SELECT 
    PUE.LocID, 
    PUE.Name, 
    IsNull(sum(PUOS.Quantity),0) as [Quantity], 
    AVG((PUOS.Quantity * PUOS.UnitPrice)) AS [Avg Order Value], 
    sum(
        case when (PUOS.Quantity * PUOS.UnitPrice) > 
                AVG((Quantity.LocAvg * UnitPrice.LocAvg)) Then 1 
        else 0 end) 
    AS [Greater Loc Avg]
FROM Locations PUE
    OUTER APPLY (select AVG((Quantity * UnitPrice)) as Avg from Sales
                    WHERE CONVERT(date,SaleDate) <= '2014-11-30' 
                        AND PackageID <> 999  
                        AND LocID > 7598 
                        AND LocID < 7622) LocAvg
    LEFT OUTER JOIN Sales PUOS 
        ON PUOS.LocID = PUE.LocID and 
            CONVERT(date,PUOS.SaleDate) <= '2014-11-30' 
                AND PUOS.PackageID <> 999  
            WHERE PUE.LocID > 7598
                AND PUE.LocId < 7622
                AND PUE.GroupID = 473
GROUP BY PUE.LocID, PUE.Name
ORDER BY PUE.LocID, PUE.Name;

这不起作用,因为:无法绑定多部分标识符“Quantity.LocAvg”。 无法绑定多部分标识符“UnitPrice.LocAvg”。我尝试使用给出相同错误的 Avg.LocAvg。我确信有一种更简单的方法可以做到这一点,但它并没有出现在我身上,我的 Google-Fu 也没有帮助。

【问题讨论】:

  • 您的 from 子句中没有 Quantity,既不是表也不是别名。
  • 看起来 QuantityUnitPrice 是列名
  • Quantity 和 UnitPrice 是列名...我想我没有关注。
  • 那么你不能使用Quantity.LocAvg,就像Columnname.columname一样,这是不允许的。它应该是表别名或表名点列名,如tablename.columnname
  • 伙计,我知道......我应该抓住它。谢谢 NoDisplayName!

标签: sql sql-server average outer-join


【解决方案1】:

NoDisplayName 是正确的,我崇敬别名...我只是将 AVG((Quantity.LocAvg * UnitPrice.LocAvg)) 替换为 LocAvg.Avg 并且效果很好。我觉得我好笨。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2022-11-16
    • 2021-02-18
    • 2018-08-15
    相关资源
    最近更新 更多