3

以下を表示するために SQL Server Reporting Services レポートで使用できるデータ セットを作成するための最も簡単な方法は何ですか?

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.

これは、私がやろうとしていることの非常に単純化された例です (たとえば、実際のシナリオでは、「Everyone Else」を 3 つのカテゴリ行に分割して表示する必要があります)、それぞれの集計データを表示するという主な目的を示しています。他のすべての人と比較した個人(排他的)。擬似コードは問題ありません。このための SQL コードを最初に試してみたところ、かなりすぐに混乱してしまいました。もっと直接的な方法が必要であることはわかっています。

ヒントをいただければ幸いです。

4

4 に答える 4

1

後でフォーマットしてもかまわない場合は、次のようなものがあると想定します。

sales_model_02

まず、合計数のヘルパー変数が必要になります

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

次に、特定の期間(YEAR = 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

于 2009-12-21T23:56:46.703 に答える
0

私はここでいくつかの仮定をしていますが、あなたがそのようなテーブルを持っているなら

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,
)

そのようなデータが入力されています

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('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
于 2009-12-22T16:20:29.710 に答える
0

SSRS では、追加の詳細行をテーブルに入れます。次に、集計関数で Scope パラメーターを使用し、第一原理から平均を計算します。

例えば:

(Sum(Fields!Sales.Value, "table1") - Fields!Sales.Value) 
/
(Sum(Fields!NumSales.Value, "table1") - Fields!NumSales.Value)
于 2009-12-21T21:48:39.897 に答える