I am using the AdventureWorks 2008 schema.
I am writing a procedure that returns the total sales by Sales Territory for sales people. There will be multiple sales people, so they need to be concatenated together in a comma separated list to show all sales people per record.
I have a solution below using cursors but I am wondering if there are any other ways of doing this (ie: cross apply, CTE's, etc).
if OBJECT_ID('tempdb..#tmpTerritorySalesPeople') is not null
drop table #tmpTerritorySalesPeople
create table #tmpTerritorySalesPeople (TerritoryID int, TerritoryName varchar(50), TerritorySalesPeople varchar(2000))
GO
declare @territoryID int,
@territoryName varchar(50),
@salesPersonName varchar(100),
@salesPersonList varchar(2000)
--cursor for territy and tname
declare c_territory cursor for
select st.territoryid, st.name
from sales.SalesTerritory st
order by st.territoryid
open c_territory
FETCH c_territory
INTO @territoryid, @territoryname
while @@FETCH_STATUS = 0
BEGIN
declare c_territorySalesPeople cursor for
-- cursor to hold list of sales people per territory
select [SalesPersonName] = p.FirstName + ' ' + p.LastName
FROM
sales.SalesPerson SP
JOIN Person.person P
ON SP.BusinessEntityID = P.BusinessEntityID
JOIN Sales.SalesTerritory ST
ON SP.territoryID = ST.TerritoryID
where sp.territoryid = @territoryid
order by st.territoryid
set @salesPersonList = ''
open c_territorySalesPeople
fetch next from c_territorySalesPeople into @salesPersonName;
while @@FETCH_STATUS = 0
begin
if @salesPersonList = ''
set @salesPersonList = @salesPersonName
else
set @salesPersonList = @salesPersonList + ', ' + @salesPersonName
fetch next from c_territorySalesPeople into @salesPersonName;
end
close c_territorySalesPeople
deallocate c_territorySalesPeople
insert into #tmpTerritorySalesPeople
select @territoryid, @territoryname, @salesPersonList
fetch next from c_territory
into @territoryid, @territoryname
end
close c_territory
deallocate c_territory
go
select
[Sales Territory] = tsp.TerritoryName,
[Sales Person] = tsp.TerritorySalesPeople,
[TotalSalesAmount] = '$'+CONVERT(VARCHAR,sum(SOH.TotalDue),1)
FROM
sales.SalesOrderHeader SOH
JOIN #tmpTerritorySalesPeople tsp
ON SOH.TerritoryID = tsp.TerritoryID
where soh.TerritoryID is not null
group by tsp.TerritoryName, tsp.TerritorySalesPeople
order by tsp.TerritoryName
go
Source of data is Adventureworks.
Results of data:
Sales Territory,Sales Person,TotalSalesAmount
Australia,Lynn Tsoflias,"$11,814,376.10"
Canada,"Garrett Vargas, José Saraiva","$18,398,929.19"
Central,Jillian Carson,"$8,913,299.25"
France,Ranjit Varkey Chudukatil,"$8,119,749.35"
Germany,Rachel Valdez,"$5,479,819.58"
Northeast,Michael Blythe,"$7,820,209.63"
Northwest,"Pamela Ansman-Wolfe, David Campbell, Tete Mensa-Annan","$18,061,660.37"
Southeast,Tsvi Reiter,"$8,884,099.37"
Southwest,"Linda Mitchell, Shu Ito","$27,150,594.59"
United Kingdom,Jae Pak,"$8,574,048.71"