【问题标题】:T-SQL AVG of multiple columns in a row一行中多列的 T-SQL AVG
【发布时间】:2018-04-08 00:18:24
【问题描述】:

我正在尝试从AdventureWorks 数据库中选择每个地区每个人的平均销售额。

由于这是聚合一行中的多列而不是一列中的多行,我似乎需要一个子查询、临时表,也许是 CTE,但我不确定如何确定哪个方向采取或如何写。

想要的结果:

| SalesTerritory | SalesPeople | 2011   | 2012    | 2013    | 2014    | AvgSales
+----------------+-------------+--------+---------+---------+---------+----------
| Australia      | 1           | NULL   | NULL    | 184105  | 1237705 | [avg]
| Canada         | 2           | 115360 | 3426082 | 2568323 | etc...  | [avg]

代码:

SELECT
    pvt.SalesTerritory,
    COUNT(pvt.SalesPersonID) AS SalesPeople,
    SUM(pvt.[2011]),
    SUM(pvt.[2012]),
    SUM(pvt.[2013]),
    SUM(pvt.[2014])

    --What's the best way to AVG the sales by year by sales person for each territory here?
 FROM    
     (SELECT
          st.[Name] AS [SalesTerritory],
          soh.[SalesPersonID],
          soh.[SubTotal],
          YEAR(DATEADD(m, 6, soh.[OrderDate])) AS [FiscalYear]
      FROM   
          [Sales].[SalesPerson] sp
      INNER JOIN  
          [Sales].[SalesOrderHeader] soh ON sp.[BusinessEntityID] = soh.[SalesPersonID]
      INNER JOIN  
          [Sales].[SalesTerritory] st ON sp.[TerritoryID] = st.[TerritoryID]
      INNER JOIN  
          [HumanResources].[Employee] e ON soh.[SalesPersonID] = e.[BusinessEntityID]
      INNER JOIN  
          [Person].[Person] p ON p.[BusinessEntityID] = sp.[BusinessEntityID]) AS soh
      PIVOT
          (SUM([SubTotal]) FOR [FiscalYear] IN ([2011], [2012], [2013], [2014])) AS pvt
GROUP BY    
    pvt.SalesTerritory

【问题讨论】:

    标签: sql-server tsql pivot average


    【解决方案1】:

    您有多种选择:

    1) 使用cross apply。查询看起来像:

    select
        *
    from
        (
            --put your query here
        ) t
        cross apply (select AvgSales = avg(v) from (values ([2011]), ([2012]), ([2013]), ([2014])) q(v)) q
    

    2) 自己算平均数

    SELECT
        pvt.SalesTerritory,
        COUNT(pvt.SalesPersonID) AS SalesPeople,
        SUM(pvt.[2011]),
        SUM(pvt.[2012]),
        SUM(pvt.[2013]),
        SUM(pvt.[2014]), 
    
        ISNULL(SUM(pvt.[2011]), 0) + ISNULL(SUM(pvt.[2012]), 0) 
        + ISNULL(SUM(pvt.[2013]), 0) + ISNULL(SUM(pvt.[2014]), 0)
        / CASE WHEN SUM(pvt.[2011]) > 0 THEN 1 ELSE 0 END
        + CASE WHEN SUM(pvt.[2012]) > 0 THEN 1 ELSE 0 END
        + CASE WHEN SUM(pvt.[2013]) > 0 THEN 1 ELSE 0 END
        + CASE WHEN SUM(pvt.[2014]) > 0 THEN 1 ELSE 0 END
    FROM    
         ...
    GROUP BY    
        pvt.SalesTerritory
    

    【讨论】:

      【解决方案2】:

      据我了解您的问题,您需要每个地区每位销售人员的平均年销售额。 Uzi 的回答提供了每个地区所有销售人员一起的年销售额平均值。您可以将该结果除以销售人员的数量,或使用如下查询:

      SELECT pvt.SalesTerritory, COUNT(pvt.SalesPersonID) AS SalesPeople, 
             SUM(pvt.[2011]) AS [2011], SUM(pvt.[2012]) AS [2012],
             SUM(pvt.[2013]) AS [2013], SUM(pvt.[2014]) AS [2014],
             AVG(pvt.AvgSubTotal) AS AvgSubTotal
      FROM (
        SELECT y.SalesTerritory, y.SalesPersonID, y.FiscalYear, y.SubTotal, 
               AVG(y.SubTotal) OVER (PARTITION BY y.SalesTerritory) AS AvgSubTotal
        FROM (
          SELECT x.SalesTerritory, x.SalesPersonID, x.FiscalYear, SUM(x.SubTotal) AS SubTotal
          FROM (
            SELECT st.Name AS SalesTerritory, soh.SalesPersonID, soh.SubTotal, 
                   YEAR(DATEADD(m, 6, soh.OrderDate)) AS FiscalYear
            FROM Sales.SalesPerson sp
            INNER JOIN Sales.SalesOrderHeader soh ON sp.BusinessEntityID = soh.SalesPersonID
            INNER JOIN Sales.SalesTerritory st ON sp.TerritoryID = st.TerritoryID
            INNER JOIN HumanResources.Employee e ON soh.SalesPersonID = e.BusinessEntityID
            INNER JOIN Person.Person p ON p.BusinessEntityID = sp.BusinessEntityID
          ) x
          GROUP BY x.SalesTerritory, x.SalesPersonID, x.FiscalYear
        ) y
      ) AS soh
      PIVOT (SUM(SubTotal) FOR FiscalYear IN ([2011], [2012], [2013], [2014])) AS pvt
      GROUP BY pvt.SalesTerritory;
      

      Northwest 区域的结果不同,但我不确定您想要哪个结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-05
        • 1970-01-01
        • 2012-01-01
        • 2011-06-11
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 2022-01-18
        相关资源
        最近更新 更多