2015-04-24 3 views
1

У меня есть выражение, которое вычисляет значение в текстовом поле. Я хотел бы в конце отчета иметь в общей сложности все поля в этом текстовом поле. Однако выражение использует именованные поля из запроса, которые также суммируются.Итоговое выражение в SSRS

=SUM(Fields!Total_Defective__.Value)/SUM(Fields!sales_Dollars.Value) 

Всего_Defective__ и sales_Dollars приведены в конце отчета. Поэтому, когда я помещаю это выражение в полное поле для этого столбца, он выполняет вычисление по итоговым значениям для других столбцов. Это приводит к некорректному результату, поскольку он основан на итогах других полей. то, что я пытаюсь сделать, это суммирование столбца. Я попробовал Use a summary field in an expression in SSRS reports, но это только дает мне строку выше общей суммы, и вы не можете ее заполнить.

Так отчет выглядит следующим образом:

enter image description here

COQ общая colummn принимает в общей сложности Дефектные $/продажи. Я хотел бы, чтобы добавить столбец (Coq) составит $ 0,39

Вот что запрос выглядит следующим образом:

--Prod Qty 
SELECT Division as 'division', SUM(prodtable.qtysched)as 'qty',rtrim(Ltrim(itemgroupid)) as 'itemGroup' 
into #SCHED 
FROM MiscReportTables.dbo.PlantDivisions 
inner join prodtable on prodtable.dimension2_ = MiscReportTables.dbo.PlantDivisions.Division 
WHERE PlantID IN (@plantid) 
and SCHEDDATE between @start and @end 
Group by itemgroupid,MiscReportTables.dbo.PlantDivisions.Division 

--sales qty 
Select Division as 'Division', SUM(SALESQTY) as 'salesQTY',rtrim(Ltrim(salesline.itemgroupid)) as 'itemGroup' 
into #salesQty 
FROM MiscReportTables.dbo.PlantDivisions 
inner join prodtable on prodtable.dimension2_ = MiscReportTables.dbo.PlantDivisions.Division 
inner join SalesLine on SalesLine.InventrefId = ProdTable.ProdiD 
WHERE PlantID IN (@plantid) 
and SCHEDDATE between @start and @end 
Group By Division,salesLine.itemgroupid 

--SALES Dollars 
Select Division as 'Division', 
(SUM(SALESQTY) - REMAINSALESFINANCIAL) * (SalesPrice/PriceUnit) as 'sales$', 
rtrim(Ltrim(salesline.itemgroupid)) as 'itemGroup' 
into #salesDollars 
FROM MiscReportTables.dbo.PlantDivisions 
inner join prodtable on prodtable.dimension2_ = MiscReportTables.dbo.PlantDivisions.Division 
inner join SalesLine on SalesLine.InventrefId = ProdTable.ProdiD 
WHERE PlantID IN (@plantid) 
and SCHEDDATE between @start and @end 
Group By Division,salesLine.itemgroupid,REMAINSALESFINANCIAL,SalesPrice,PriceUnit 


SELECT 
    dbo.TQMNCR.NCRID, 
    dbo.TQMPlantTable.PlantName AS 'Division', 
    RTRIM(LTRIM(dbo.INVENTTABLE.ITEMGROUPID)) AS 'Item Process/Group', 
    dbo.TQMNCRDEFECTTYPECODES.QTY AS 'Defective Qty', 
    CASE CATYPE 
     WHEN 0 THEN 
      (CASE WHEN dbo.SALESLINE.SALESID = '' 
       THEN ISNULL((PRICE * (PERCENTEXT/100))/NULLIF(dbo.INVENTTABLEMODULE.PRICEUNIT, 0), 0) * dbo.TQMNCRDEFECTTYPECODES.QTY 
       ELSE ISNULL((SALESPRICE * (PERCENTEXT/100))/NULLIF(dbo.SALESLINE.PRICEUNIT, 0), 0) * dbo.TQMNCRDEFECTTYPECODES.QTY END) 
     WHEN 2 THEN 
      (CASE WHEN dbo.TQMNCR.SALESID = '' 
       THEN ISNULL((PRICE * (PERCENTINT/100))/NULLIF(dbo.INVENTTABLEMODULE.PRICEUNIT, 0), 0) * dbo.TQMNCRDEFECTTYPECODES.QTY 
       ELSE ISNULL((SALESPRICE * (PERCENTINT/100))/NULLIF(dbo.SALESLINE.PRICEUNIT, 0), 0) * dbo.TQMNCRDEFECTTYPECODES.QTY END) 
     ELSE 0 END AS 'Total Defective $', 
    dbo.PRODTABLE.PRODPOOLID 
    ,#SCHED.qty, 
    (#SCHED.qty - dbo.TQMNCRDEFECTTYPECODES.QTY)/#SCHED.qty as 'First Pass Yield', 
    #salesQty.salesQty as 'Sales Quantity', 
    #salesDollars.sales$ as 'sales Dollars' 
FROM 
    dbo.TQMNCR LEFT OUTER JOIN 
    dbo.TQMDISPOSITION ON dbo.TQMNCR.DISPOSITIONID = dbo.TQMDISPOSITION.DISPOSITIONID LEFT OUTER JOIN 
    dbo.TQMCA_TABLE ON dbo.TQMCA_TABLE.NCRID = dbo.TQMNCR.NCRID LEFT OUTER JOIN 
    dbo.TQMNCRDEFECTTYPECODES ON dbo.TQMNCR.NCRID = dbo.TQMNCRDEFECTTYPECODES.NCRID LEFT OUTER JOIN 
    dbo.TQMPlantTable ON TQMPlantTable.PlantID = dbo.TQMNCR.PlantID LEFT OUTER JOIN 
    dbo.INVENTTABLE ON dbo.TQMNCR.ITEMID = dbo.INVENTTABLE.ITEMID LEFT OUTER JOIN 
    dbo.INVENTTABLEMODULE ON dbo.INVENTTABLE.ITEMID = dbo.INVENTTABLEMODULE.ITEMID AND MODULETYPE = 2 LEFT OUTER JOIN 
    dbo.SALESLINE ON dbo.SALESLINE.SALESID = dbo.TQMNCR.SALESID AND dbo.SALESLINE.ITEMID = dbo.TQMNCR.ITEMID LEFT OUTER JOIN 
    dbo.PRODTABLE ON dbo.TQMNCR.PRODID = dbo.PRODTABLE.PRODID 
    inner join #sched on #sched.itemGroup = INVENTTABLE.itemgroupid 
    inner join #salesQty on #salesQty.itemGroup = INVENTTABLE.itemgroupid 
    inner join #salesDollars on #salesDollars.itemgroup = INVENTTABLE.itemgroupid 
WHERE 
    SCHEDDATE between @start and @end 
    AND 
    dbo.TQMNCR.PlantID IN (@plantid) 
ORDER BY dbo.INVENTTABLE.ITEMGROUPID, dbo.TQMPlantTable.PlantName 


drop table #sched 
drop table #SalesQty 
drop table #salesDollars 

и вот то, что результирующий набор выглядит следующим образом: enter image description here

В докладе сгруппирован по Item_Process, Division, Total_Defective

ответ

2

Вы можете попробовать добавить поле COQ в качестве нового Расчетного поля в вашем наборе данных. Выполнение этого будет выполнять расчет на уровне набора данных, а не на уровне группировки Tablix.

Adding a calculated field to a dataset

Допустим, вы назвали это новое поле "COQ".

Тогда в вашей общей строке, введите выражение Сумма (поля! COQ.Value) как ваше общее количество.

Это должно сначала выполнить расчет для COQ каждой строки, а затем суммировать результат в общей строке.

EDIT: Вышеуказанное будет работать, если ваш набор данных был сгруппирован точно так же, как и ваш стол. Если это не так (как вы указали) и ваш стол в SSRS фактически сгруппированные из более детального набора данных, вы можете составить свои группы, используя выражение ниже:

=Sum(IIF(Sum(Fields!sales_Dollars.Value,"YOURGROUPNAME") > 0, 
Sum(Fields!Total_Defective__.Value,"YOURGROUPNAME")/
Sum(Fields!sales_Dollars.Value,"YOURGROUPNAME"), 0)) 

Это следует оценить расчет в каждый член GROUP BY, а затем SUM - результат вычисления по всей таблице/набору данных.

+0

Я не могу этого сделать, поскольку SQL возвращает много строк с разными значениями COQ. Затем они группируются с помощью Item_Process_Group, Division и Defective_Qty. Выполнение этого таким образом дает мне негруппированную сумму в конце, которая оказывается в тысячах. – rigamonk

+0

А, это позор! И могу ли я предположить, что вы не можете изменить SQL для выполнения группы там? – GShenanigan

+0

Исправить в большинстве случаев. Я использую валюту и, видимо, есть ошибка, поэтому я изменил заявление ... но в одном случае я получаю #error ... не знаю, почему: = СУММ (IIf (SUM (Fields! Sales_Dollars.Value, «Item_Process_Group»)> 0, (SUM (Fields! Total_Defective __. Value, «Item_Process_Group»)/IIF (SUM (Fields! Sales_Dollars.Value, «Item_Process_Group») <= 0, 1, SUM (Fields! Sales_Dollars.Value, Item_Process_Group "))), 0)) – rigamonk

1

Вы должны быть в состоянии сделать это с

=SUM(Fields!Total_Defective__.Value/Fields!sales_Dollars.Value) 

Так что он делит каждое значение, затем суммирует, а не суммируя значения перед делением.

EDIT: если вы разделите на ноль ошибок, которые вы можете добавить следующее в Report - Отчет Свойства - код:

Public Function Quotient(ByVal numerator As Decimal, denominator As Decimal) As Decimal 
    If denominator = 0 Then 
     Return 0 
    Else 
     Return numerator/denominator 
    End If 
End Function 

(Ref: http://williameduardo.com/development/ssrs/ssrs-divide-by-zero-error/)

вВведите формулу

=SUM(code.Quotient(Fields!Total_Defective__.Value,Fields!sales_Dollars.Value) 

Затем вы должны получить желаемый результат с относительно коротким кодом в своем выражении.

+0

Я получаю #error с помощью этого метода – rigamonk

+0

Является ли sales_Dollars когда-либо нулевым? –

+0

@rigamonk Да, это деление на нулевую ошибку, по крайней мере угадывая его другой вопрос по этой теме. Это означает, что это, вероятно, правильный ответ, если вы добавите Iif к сумме. – Randall

1

Я верю, что ваше требование выходит за рамки возможностей только SSRS. Я бы переместил группировку в набор данных SQL и (после группировки по 9 "деталям" в вашем примере), я бы вычислил COQ в этом наборе данных, например.

SELECT * 
, Total_Defective/Sales AS COQ 
FROM (
    SELECT 
    MyGroupColumns 
    , SUM (Total_Defective) AS Total_Defective 
    , SUM (Sales) AS Sales 
    FROM MyTable 
    GROUP BY 
    MyGroupColumns 
) D1 

Тогда SSRS можно просто представить детали Coq для вывода 9 строк из набора данных, и вы можете использовать функцию SSRS Sum(), чтобы получить Coq для Total подряд.

+0

Я не уверен, где разместить это в моем запросе. заменит ли мой основной выбор, или я буду читать в D1? Я считаю, что это немного превышает мой опыт работы с sql – rigamonk

+0

Он может заменить ваш основной выбор. Из вашего текущего SELECT скопируйте список столбцов, чтобы заменить там, где у меня есть «MyGroupColumns». Затем скопируйте инструкцию FROM (включая любые предложения JOIN) и инструкцию WHERE для замены моего «FROM MyTable». Я также исправил опечатку в своем коде. –

Смежные вопросы