2009-12-21 2 views
3

다음 표시하는 SQL Server Reporting Services를 보고서에 사용할 수있는 데이터 세트를 생산하는 가장 간단한 방법 무엇입니까 :는 SQL 집계 쿼리 도움이 필요

SalesPerson  # Sales  # Gross  Profit 
John Doe    100  $140,000  $25,000 
Everyone Else (Avg.) 1200  $2,000,000  $250,000 


Jane Smith    80  $100,000  $15,000 
Everyone Else (Avg.) 1220  $2,040,000  $260,000 


...and so on. 

이것은 매우, 매우 단순화되어가 예를 들어, 실제 시나리오는 '다른 모든 사람'을 3 개의 범주 행으로 나눠서 표시하는 것과 관련이 있지만, 다른 모든 사람들과 비교하여 각 개인에 대한 집계 데이터를 표시하는 주된 목적을 보여줍니다. (독특한). 의사 코드는 괜찮을거야. 이것에 대한 SQL 코드의 첫 번째 찌르기가 꽤 빨리 엉망이되어 더 직접적인 방법이 있어야한다는 것을 알고 있습니다.

감사의 말씀.

+0

SSAS를 사용할 수 있습니까? 꽤 쉽게 만들 수있는 몇 가지 기능이 있습니다. – DrewM

+1

정보를 얻는 것은 쉽습니다. 제공 한 레이아웃에서 서식을 지정하면 고통이 될 것입니다.일반적으로 총합 및 계산은 결과 집합의 끝에 표시됩니다. –

+0

+1에 Pony의 코멘트. SQL은 출력 형식화에 적합한 도구가 아닙니다. –

답변

1

는 다음과 같은 뭔가를

/* Few helper variables*/ 
DECLARE @TotalQuantity int 
     ,@TotalAmount decimal(19, 4) 
     ,@TotalProfit decimal(19, 4) 
     ,@EveryoneElse int 

그러면 주어진 p에있는 모든 사람에게 합계를 가져옵니다. eriod (= 2009 년) 다른 사람 대 사람마다 지금

/* Fetch totals in the period*/ 
SELECT @TotalQuantity = sum(SalesQuantity) 
     ,@TotalAmount = sum(SalesAmount) 
     ,@TotalProfit = sum(Profit) 
     ,@EveryoneElse = count(DISTINCT SalesPersonKey) - 1 
FROM factSales AS s 
     JOIN dimDate AS d ON s.DateKey = d.DateKey 
WHERE [Year] = 2009 

/* Now we have totals for everyone in the period */ 

그리고 있지만, 한 행의 모든.

/* Totals for each sales person vs everyone else Average */ 
SELECT FullName 
     ,SUM(SalesQuantity) AS [PersonSalesCount] 
     ,SUM(SalesAmount) AS [PersonSalesAmount] 
     ,SUM(Profit) AS [PersonSalesProfit] 
     ,(@TotalQuantity - SUM(SalesQuantity))/@EveryoneElse AS [EveryoneElseAvgSalesCount] 
     ,(@TotalAmount - SUM(SalesAmount))/@EveryoneElse AS [EveryoneElseAvgSalesAmount] 
     ,(@TotalProfit - SUM(Profit))/@EveryoneElse AS [EveryoneElseAvgSalesProfit] 
FROM factSales AS s 
     JOIN dimDate AS d ON s.DateKey = d.DateKey 
     RIGHT JOIN dimSalesPerson AS p ON p.SalesPersonKey = s.SalesPersonKey 
WHERE [Year] = 2009 
GROUP BY FullName 

이제이 모든 것을 날짜 간격의 매개 변수가있는 저장 프로 시저에 패키지화 할 수 있습니다. 특정 기간에 어떤 것이 활성 이었는지를 결정하기 위해 판매 인력의 수를 조정할 필요가 있으며, 판매하지 않은 사람들을 세는 방법도 필요합니다. 이 경우 EveryoneElse은 -1을 판매 한 판매원 수를 의미합니다. 그래서 만약 당신이 10 명의 판매원을 가지고 있고 단지 5 대를 팔았다면, EveryoneElse = 4보다.

+0

모든 영업 사원을 하나의 카테고리로 고려할 때 훌륭한 방법입니다. 3 단계 계층 구조 (사람 대 지점, 사람 대 지역, 사람 대 국가)를 통해 집계 비교를 제공하기 위해 어떻게 조정할 것입니까? –

+0

인물이 지사, 지역, 국가에 있음 - 'WHERE [연도] = 2009 AND [지역] ='북쪽 '또는'WHERE [연도] = 2009 AND [국가] = '캐나다'; 기본적으로 지점, 지역, 국가에 필터. –

+0

감사합니다, Damir. 맞아, 너는 단 한 사람에게 필요한 것을 나에게 줄 것이다. 한 번에 여러 사람을 대상으로 결과 세트를 실행한다는 측면에서 실제로 생각하고있었습니다. 그 그룹화 작업을 얼마나 쉽게 할 수 있을지 모르겠습니다. 어떤 아이디어입니까? –

0

거의 확실히 매우 확대됨에 아니지만, 선언적으로 명확 :

declare @i int = 0 
declare @j int = 1 

select * from 
(
select (@i = @i + 2) as order_col, SalesPerson, sales, gross, profit 
from myTable order by SalesPerson 

union all 

select (@j = @j + 2) as order_col, 'Everybody else' 
, (select sum(sales) from myTable i where i.SalesPerson <> o.Salesperson) 
, (select sum(gross) from myTable i where i.SalesPerson <> o.Salesperson) 
, (select sum(profit) from myTable i where i.SalesPerson <> o.Salesperson) 
from myTable o 
order by SalesPerson 
) x order by order_col 

(있습니다 .. UNION의 두 번째 부분은 확실히 개선 될 수 있지만,이 늦게 나는 똑바로 생각할 수 없다)

0

SSRS에서 표에 추가 세부 행을 입력하십시오. 그런 다음 집계 함수에 Scope 매개 변수를 사용하고 첫 번째 원칙에서 평균을 수행합니다.

예 : 나는 총 개수에 대한 몇 가지 도우미 변수가 필요합니다

sales_model_02

첫째 : 나중에 포맷 괜찮다면 우리가 가정하면

(Sum(Fields!Sales.Value, "table1") - Fields!Sales.Value) 
/
(Sum(Fields!NumSales.Value, "table1") - Fields!NumSales.Value) 
0

여기 몇 가지 가정을하고 있지만 너무

Insert into Sales values ('John Doe', 100, 200.00, 100.00) 
Insert into Sales values ('John Doe', 125, 300.00, 100.00) 
Insert into Sales values ('Jane Smith', 100, 200.00, 100.00) 
Insert into Sales values ('Jane Smith', 125, 1.00, 0.50) 
Insert into Sales values ('Joel Spolsky', 100, 2.00, 1.00) 
Insert into Sales values ('Joel Spolsky', 125, 3.00, 1.00) 

같은 데이터로 채워집니다 그래서

If object_id('Sales') is not null 
    Drop table Sales 

CREATE TABLE [dbo].[Sales] 
(
[Salesperson] [nvarchar](50) NULL, 
[Sales] [int] NULL, 
[Gross] [money] NULL, 
[Profit] [money] NULL, 
) 

같은 테이블이있는 경우 다음과 같이 저장 프로 시저 당신을 제공 할 수 있습니다 무엇을 찾고 있습니다

If object_id('usp_SalesReport') is not null 
Drop procedure usp_SalesReport 

Go 


Create Procedure usp_SalesReport 
as 
Declare @results as table 
(
SalesPerson nvarchar(50), 
Sales int, 
Gross money, 
Profit money 
) 

Declare @SalesPerson nvarchar(50) 
Declare SalesSums CURSOR FOR 

Select distinct SalesPerson from Sales 

Open SalesSums 

Fetch SalesSums INTO @SalesPerson 

While @@Fetch_Status = 0 

Begin 
Insert into @results Select Sales.Salesperson, sum(sales), sum(Gross), sum(profit) from Sales group by Sales.Salesperson having Sales.Salesperson = @SalesPerson 
Insert into @results Select 'EveryoneElse', avg(sales), avg(Gross), avg(profit) from Sales where Salesperson <> @SalesPerson 

Fetch SalesSums INTO @SalesPerson   
End 
Select * from @results 
Close SalesSums 
Deallocate SalesSums 
Return