Агрегация сервера отчетов по группам по линиям - PullRequest
0 голосов
/ 02 марта 2009

Может быть, это вопрос новичка, но

Представьте, что у меня есть отчет, который показывает список заказов на продажу или торговый представитель, постатейный до уровня sku и хотите показать, сколько процентов от общей продажи 1 sku продал торговый представитель.

* 1005 Т.е. *

Продажи людей

  • Список заказов

         - List of items              no sold:  5  out of this months total 942
    

Пример:

Джон Доу

- Order #12312

      - SKU SP1231     Sold 5 . Month total 445

      - SKU SP4141     Sold 63 .  Month total 300

Эмма Доу

- Order #123324

      - SKU SP1231     Sold 65 . Month total 445

      - SKU SP4141     Sold 2 .  Month total 300

и т.д.

Итоговая цифра за месяц - это количество проданных товаров этого конкретного артикула за отчетный период.

Как мне добавить этот номер? Если я использую Fields!TotalAmount.Value, это дает итоговое значение как итоговое значение группы. т.е. сколько sku Y было продано по заказу X торговым представителем Z.

Мне нужен общий объем продаж этой конкретной SKU.

Если я говорю SUM(Fields!Amount,Nothing), чтобы установить глобальную область видимости, он дает сумму ВСЕХ sku, а не только рассматриваемого sku.

Как мне это сделать?

EDIT

Сервер отчетов - SSRS, в отчете используется общий источник данных, который представляет собой модель отчета, уже размещенную на сервере отчетов, который указывает на базу данных SQL Server с содержимое.

Ответы [ 2 ]

0 голосов
/ 02 марта 2009

Что мне нужно сделать, это выбрать общую сумму Sku в наборе данных отчета, используя разделенные запятыми списки :

-- testing data
DECLARE @Order TABLE (ID INT, SalesRepID INT, Date DATETIME)
INSERT INTO @Order
SELECT 1, 1, GETDATE() UNION
SELECT 2, 2, GETDATE() UNION
SELECT 3, 1, GETDATE() UNION
SELECT 4, 1, GETDATE() UNION
SELECT 5, 2, GETDATE()

DECLARE @OrderDetail TABLE (ID INT, OrderID INT, SkuID INT, SkuCount INT)
INSERT INTO @OrderDetail
SELECT 1, 1, 1, 10 UNION
SELECT 2, 1, 2, 5 UNION
SELECT 3, 1, 3, 20 UNION
SELECT 4, 1, 4, 10 UNION
SELECT 5, 2, 1, 15 UNION
SELECT 6, 2, 2, 25 UNION
SELECT 7, 2, 3, 15 UNION
SELECT 8, 3, 1, 15 UNION
SELECT 9, 3, 1, 10 UNION
SELECT 10, 3, 3, 10 UNION
SELECT 11, 3, 4, 15 UNION
SELECT 12, 4, 1, 5

DECLARE @Sku TABLE (ID INT, SkuCode VARCHAR(10))
INSERT INTO @Sku
SELECT 1, 'SP1233' UNION
SELECT 2, 'SP2262' UNION
SELECT 3, 'SP1531' UNION
SELECT 4, 'SP4235'

DECLARE @SalesRep TABLE (ID INT, SalesRepName VARCHAR(20))
INSERT INTO @SalesRep
SELECT 1, 'John Doe' UNION
SELECT 2, 'Emma Doe'

    -- filters for testing
DECLARE @StartDate DATETIME, @EndDate DATETIME
SELECT  @StartDate = GETDATE(), @EndDate = GETDATE()

DECLARE @SkuIDList VARCHAR(8000), @SkuSumList VARCHAR(8000)
SELECT @SkuIDList = '', @SkuSumList = ''
--gether all sku IDs and Sum in two comma separated list
SELECT @SkuIDList = @SkuIDList + CONVERT(VARCHAR, OD.SkuID) + ',', 
@SkuSumList = @SkuSumList + CONVERT(VARCHAR, SUM(OD.SkuCount)) + ','
FROM @Order O 
INNER JOIN @OrderDetail OD ON O.ID = OD.OrderID
WHERE O.Date BETWEEN @StartDate AND @EndDate
GROUP BY OD.SkuID
-- remove last ','
SELECT @SkuIDList = SUBSTRING(@SkuIDList, 0, LEN(@SkuIDList)),
 @SkuSumList = SUBSTRING(@SkuSumList, 0, LEN(@SkuSumList))

-- include thouse lists in the main select for your report dataset
SELECT O.ID, OD.SkuID, O.SalesRepID, SR.SalesRepName, S.SkuCode, 
    OD.SkuCount, @SkuIDList AS SkuIDs, @SkuSumList AS SkuSums
FROM @Order O 
INNER JOIN @OrderDetail OD ON O.ID = OD.OrderID
INNER JOIN @Sku S ON OD.SkuID = S.ID
INNER JOIN @SalesRep SR ON O.SalesRepID = SR.ID
WHERE O.Date BETWEEN @StartDate AND @EndDate

Затем вы можете использовать некоторый обычный код для получения значения суммы по идентификатору sku (я сейчас пишу на C #, вы легко конвертируете его в VB):

public int GetSkuSum(string skuSumCSV, string skuIDCSV, int searchSkuID)
{
    string[] strSkuSum = skuSumCSV.Split(',');
    string[] strSkuID = skuIDCSV.Split(',');

    for (int i = 0; i < strSkuID.Length; i++)
    {
        if (Convert.ToInt32(strSkuID[i].Trim()) == searchSkuID)
        {
            return Convert.ToInt32(strSkuSum[i]);
        }
    }
    return 0;
}

Затем используйте его в текстовом поле Выражение значения:

=Code.GetSkuSum(Fields!SkuIDs.Value,Fields!SkuSums.Value,Fields!SkuID.Value)
0 голосов
/ 02 марта 2009

Вы не сказали, какую СУБД вы используете (явно не в Oracle из поля Fields! Amount). Это работает для вашей СУБД?:

with sku_sales as
( select sku, sum(value) as sku_value
  from   sales
  group by sku
)
select sales.salesperson, sum(sales.value), sku_sales.sku_value
from   sales
join   sku_sales on sku_sales.sku = sales.sku
group by sales.salesperson, sku_sales.sku_value
...