SSRS Get previous value in row group - reporting-services

I have A tablex which has row grouping , trying to do some calculation base on the previous row in the group. so I tested Last(Fields!InQty.Value) and put it in the total cell. and it get the value of the same row :
When I tried Previous(Fields!InQty.Value) it get the value from the last row in the previous group :
so what is the way to get the previous value in the same group, also how to check if the row is the first in the group.
Thank you.

This sounds like something you could just wrap inside an IF statement, perhaps as follows:
=IIF(Previous(Fields!ItemName.Value)=Fields!ItemName.Value,Previous(Fields!InQty.Value),Nothing)
...Or replace the Nothing with some constant if it's part of a larger calculation expression.

I think the best way in SSRS to do this is to use the RowNumber value for the group the cell is in (I'm calling it "Item" in the example below), and check that the RowNumber value for the group is greater than 1 before collecting the previous value. If it isn't greater than 1 you can put Nothing in the table cell:
=Iif(RowNumber("Item") > 1, Previous(Fields!InQty.Value), Nothing)

Related

SSRS - Find first occurrence within row group where condition holds and display value

I need to get the first value within a large data-set, based on a row group where the condition holds true.
I.e: Get the First Value Where Deal Name is "ABC" and Type = "main" within a row group (scope) of a entire dataset.
I tried the following:
=IIF(Fields!DealName.Value="ABC" AND Fields!Type.Value="Main", First(Fields!DealValue.Value, "Deal"), NOTHING)
There are 3 records with distinct values for Deal Values.
In this scenario, it is picking up 0, when it should have picked up 4946.
Can I have the entire if statement in a scope?
Help would be immensely appreciated.
If I understand it right, you want to get first value based on if condition. Then you can use LookUp
Lookup(1, IIF(Fields!DealName.Value="ABC" AND Fields!Type.Value="Main", 1, NOTHING), Fields!DealValue.Value, "DateSetName")

How to Sum the aggregates of a child group

This should be easy, but I am stuck.
I have a table listing some figures about Qualifications - to achieve which a dataset that is essentially a row per Student is being grouped on Qualification with a Parent Grouping on "Measure" (which is just a bucket of qualifications).
One of the columns is trying to work out the number of students (well, more properly the number of students with a value in a particular field, weighted by another field) in each Measure/Qualification. In the screenshot below, it's the "Pred. Avg" column on the right hand side.
So for the Qualification Row Grouping, that column is calculated by:
=CountDistinct(Iif(IsNothing(Fields!AVG_PTS.Value) = False, Fields!Learner_ID.Value, Nothing), "Qual") * Lookup(Fields!Qual_Code.Value, Fields!Qual_Code.Value, Fields!size.Value, "DS_KS5Nationals_LKP")
This works fine - the values of 35 and 11.5 in that rightmost column are correct for those rows. What the top row should be doing is simply adding up the values in the other rows to give me the number of students in this Measure, in this case to give 46.5. To do that the expression I am using is:
=Sum(CountDistinct(Iif(IsNothing(Fields!AVG_PTS.Value) = False, Fields!Learner_ID.Value, Nothing), "Qual") * Lookup(Fields!Qual_Code.Value, Fields!Qual_Code.Value, Fields!size.Value, "DS_KS5Nationals_LKP"), "Measure")
However as you can see in the screenshot, this returns 2917 instead.
So my question is; Why doesn't that work, and given that it doesn't work how can I, within a parent group, aggregate the results of aggregates inside a child group?
EDIT:
OK so, I have determined that the following works correctly:
=Sum(CountDistinct(Iif(IsNothing(Fields!AVG_PTS.Value) = False, Fields!Learner_ID.Value, Nothing), "Qual"), "Measure")
The problem there is that the Qual row that returns 11.5 is weighted to 0.5. I.E. it actually returns 23, and the Lookup(Fields!Qual_Code.Value, Fields!Qual_Code.Value, Fields!size.Value, "DS_KS5Nationals_LKP") is for that row returning 0.5 and altering it to 11.5...so the question becomes; "how do I force that ...*Lookup(Fields!Qual_Code.Value, Fields!Qual_Code.Value, Fields!size.Value, "DS_KS5Nationals_LKP") into the "Qual" scope, like the CountDistinct() is already in?
The issue here is that you're trying to aggregate values using that Lookup function which only returns one value. There are a couple ways you could go about doing this. One option would be to use the LookupSet function to get the applicable weightings. An even better option is to combine the data in your dataset so that the weighting is available without using a lookup. That way the function can recalculate an any grouping level without you having to force a scope on it. Also, CountDistinct ignores "Nothing" so you can do without the extra IIf statement. Hope that helps.

ssrs expression sum doesn't sum all column

I have a column like:
LEFT_PIN_HEIGHT_MIN
0
0
0
1
1
0
I wrote it to Tablix as below,
=Sum(Fields!LEFT_PIN_HEIGHT_MIN.Value)
I want to sum the fields and result must be "2" but it doesn't sum the column
and writes all the rows to Tablix.
I agree with the previous answer that your first choice ought to be to calculate this in the SQL, but sometimes that is not as practical.
Are you trying to display the column's sum in each row? If so, add the dataset name as a second parameter in the sum function, as in
=Sum(Fields!LEFT_PIN_HEIGHT_MIN.Value,"Dataset1")
Replace "Dataset1" with the name of your dataset. The Sum function you're currently using is defining the sum within the context of each row in your tablix. Adding the second parameter changes that context to return the sum for the entire dataset in each row.
If your tablix is large, this may result in a performance hit, since the expression will evaluate each time it is displayed, hence the preference toward doing it in your dataset query.
I suggest to do It with SQL. Use query to SELECT SUM(LEFT_PIN_HEIGHT_MIN)...
If you want to achieve It by SSRS expression you can do It in following:
Right Click on table1_Details_Group > Group Properties...
In Group on: field provide LEFT_PIN_HEIGHT_MIN click OK
To hide 0 > Right Click on left side of values row > Row Visibility check Show or hide based on an expression then write following expression: =IIF(Fields!LEFT_PIN_HEIGHT_MIN.Value = 0, true, false) click OK
It should work.

SSRS fills in arbitrary value when no result is returned in query

I have a report with column and row groups to calculate inventory.
there are some items in a column group that do not have any results in the query.
for example, item 009000 does not have any inventory entries in FY2016, I checked the query and indeed, there is nothing in it for that item in FY2016.
the report fills something in however and fills in the same value for every empty result. Even more confusing, this arbitrary value changes if I refresh the report. I want this field empty, I've used IsNothing and <> '' and <> 0 but to no avail, it always fills something in (second screenshot). I'm so confused. I have no idea what could be causing it, there is no calculation in the field. (first screenshot)
Change expression for example, if you have numeric field then use expression =Sum(Inventory.value) instead of =Inventory.value
s

SSRS Row Group + Column Group = RowNumber Issue

I'm back with another SSRS question :-)
I'm dealing with survey data. I have a procedure that's returning an organization's response counts per question. So my report is defined as Group on Organization for row and Group on answer for columns. Both the number of organizations and answers are variable. That's working as expected. I've tried adding a RowCount next to the organization so that I can show rank, but the fact that each org has one row per question means that I'm getting eight rows per org.
Here's an example:
Here is my report definition:
The rank expression is currently: =RowNumber(Nothing)
Ideally, the rank would be 1, 2, 3, 4, etc... I've tried scope to the row group, column group and nothing. No help.
Any assistance would be greatly appreciated!
Had same frustrating issue; lots of time wasted. Eventually, this solution also helped:
=RunningValue(CountDistinct("YourTableName"),Count,"YourTableName")
Trick here is NOT to use the name of the group within the table/matrix, but the name of the table itself. And yes, one would think that using the table name for the scope in the function RowNumber should work, but it doesn't.
Try using:
runningvalue(Fields!AnswerText.Value,CountDistinct,"NameOfOrganizationGroup")
If its a matrix, change the name of the scope from the row scope to the matrix scope.
I do with custom code.
Add this to code section on report config:
Dim private count as integer = 0
Dim private iniRow as integer = 0
Public function nroFila(Byval rowNum as integer) as integer
if iniRow = 0 then
iniRow = rowNum
end if
if rowNum = iniRow then
count = 0
end if
count = count + 1
Return count
End function
Then, call the function in a cell inside the group:
=Code.nroFila(RowNumber(Nothing))
I seem to have found a solution, but it feels like a hack... I'm leaving this unanswered to see if someone else can provide a better solution (read less hackish).
My Rank Expression is now:
=RowNumber(Nothing)/Count(Fields!AnswerText.Value)
Everything seems to be ok. I suppose I should IIf(Count... = 0, Then RowNumber, else what I've got...
Best thing to do here, is make the Rank column equal to =RowCount()/8
Since your sure each visible row contains a total of 8 rows, this should work fine.
Add another rank column next to the existing one and put another expression in that one which takes the value from rank (rowcount?) and divide it by 8. Then make the old rank column invisible.
Are you absolutely certain that using RowNumber("NameOfOrganizationGroup") doesn't work?
Click on the matrix, click the upper-left corner selection box to select the entire thing, then right-click on the selection border and get properties. Switch to the Groups tab and look at the names of the groups in the Rows section. That's what goes in the scope of the RowNumber() function.
If you already know this and tried it, my apologies—I didn't mean to assume you didn't know. It's just not 100% clear from your question that this is not the solution.
I got it by using a windowed function in the SQL query, this counts the row correctly within the column set.
dense_rank() over (partition by mgr.employee_sk order by e.employee_sk) as row_format
where mgr.employee_sk is my Lvl 2 Row Group, and e.employee_sk is my Lvl 3 Row Group (the detail level).
Then the SSRS expression then refers to this column from the query. To avoid it aggregating I used a min function, and to avoid it not displaying for rows that don't have data in all columns of the column group I specified the scope as my Level 3 Row Group.
=Iif(min(Fields!row_format.Value, "Employee") mod 2 = 1, "white", "aliceblue")