Sql server TSQL PIVOT[年度]、计数(销售人员)和按[地区]分组
从AdventureWorks数据库中,我试图按地区返回每年的总销售额,并包括每个地区活跃的销售人员数量。下面的代码无法按地区分组,而是为每个销售人员创建一个唯一的行。我的代码丢失了什么 期望的结果Sql server TSQL PIVOT[年度]、计数(销售人员)和按[地区]分组,sql-server,tsql,count,pivot,grouping,Sql Server,Tsql,Count,Pivot,Grouping,从AdventureWorks数据库中,我试图按地区返回每年的总销售额,并包括每个地区活跃的销售人员数量。下面的代码无法按地区分组,而是为每个销售人员创建一个唯一的行。我的代码丢失了什么 期望的结果 | SalesTerritory | SalesPeople | 2011 | 2012 | 2013 | 2014 | +----------------+-------------+--------+---------+---------+---------+ | Aust
| SalesTerritory | SalesPeople | 2011 | 2012 | 2013 | 2014 |
+----------------+-------------+--------+---------+---------+---------+
| Australia | 1 | NULL | NULL | 184105 | 1237705 |
| Canada | 2 | 115360 | 3426082 | 2568323 | etc... |
| SalesTerritory | SalesPeople | 2011 | 2012 | 2013 | 2014 |
+----------------+-------------+--------+---------+---------+---------+
| Australia | 1 | NULL | NULL | 184105 | 1237705 |
| Canada | 1 | 9109 | 1254087 | 1179530 | 1166720 |
| Canada | 1 | 106251 | 2171995 | 1388793 | 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 | 2 | 115360 | 3426082 | 2568323 | etc... |
| SalesTerritory | SalesPeople | 2011 | 2012 | 2013 | 2014 |
+----------------+-------------+--------+---------+---------+---------+
| Australia | 1 | NULL | NULL | 184105 | 1237705 |
| Canada | 1 | 9109 | 1254087 | 1179530 | 1166720 |
| Canada | 1 | 106251 | 2171995 | 1388793 | etc... |
您应该仅按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