【问题标题】:TSQL PIVOT [Year], COUNT(SalesPeople), and GROUP BY [Territory]TSQL PIVOT [Year]、COUNT(SalesPeople) 和 GROUP BY [Territory]
【发布时间】:2018-09-17 14:51:18
【问题描述】:

从 AdventureWorks 数据库中,我尝试按地区返回每年的总销售额,并包括每个地区有多少销售人员活跃。下面的代码无法按地区分组,而是为每个销售人员创建了一个唯一的行。我的代码缺少什么?

期望的结果

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

代码

SELECT
     pvt.SalesTerritory
    ,COUNT(pvt.SalesPersonID) AS SalesPeople
    ,pvt.[2011]
    ,pvt.[2012]
    ,pvt.[2013]
    ,pvt.[2014]
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
            ,[2011]
            ,[2012]
            ,[2013]
            ,[2014];

实际结果

| SalesTerritory | SalesPeople | 2011   | 2012    | 2013    | 2014    |
+----------------+-------------+--------+---------+---------+---------+
| Australia      | 1           | NULL   | NULL    | 184105  | 1237705 |
| Canada         | 1           | 9109   | 1254087 | 1179530 | 1166720 |
| Canada         | 1           | 106251 | 2171995 | 1388793 | etc...  |

【问题讨论】:

    标签: sql-server tsql count pivot grouping


    【解决方案1】:

    您应该对最上面的查询中的小计求和,并仅按 SalesTerritory 分组。

    见下文

    SELECT
         pvt.SalesTerritory
        ,COUNT(pvt.SalesPersonID) AS SalesPeople
        ,sum(pvt.[2011])
        ,sum(pvt.[2012])
        ,sum(pvt.[2013])
        ,sum(pvt.[2014])
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 2014-05-20
      • 2021-12-19
      相关资源
      最近更新 更多