In SSRS,how to count the number of dates present in a column?
I am developing a report where I need to display the total number of dates where Date_of_Delivery.Value is updated in a specific month & also I need to display the same for where Date_of_Delivery.Value is Not updated.
Please insist me.
If you want a count of the number of times a date is in a certain time period, you would use the IFF to perform the check and then SUM the results.
=SUM(IIF(Fields!Date_of_Delivery.Value >= CDATE("01/01/2016") AND Fields!Date_of_Delivery.Value <= CDATE("01/31/2016"), 1, 0)
The IFF will check to see if the Date of Delivery is between two dates and return 1 if true otherwise 0. The SUM then sums up all the results.
You should probably use some Parameters for your date so you can just change the parameters instead of the code in the report.
=SUM(IIF(Fields!Date_of_Delivery.Value >= Parameters!START_DATE.Value AND Fields!Date_of_Delivery.Value <= Parameters!END_DATE.Value, 1, 0)
Related
I have two columns with a start (column B) and end (column C) date range, and a cell (G1) with a date.
I want to be able to look at columns B and C and return true if G1 falls in between any of the date range of B and C, and if G1 is not within the date, return false.
Any suggestions on how to do this?
You can use the following formula
=IFERROR(IF(
QUERY(L2:M14,"WHERE L <= DATE '"&TEXT(K2, "yyyy-mm-dd")&"'
AND M >= DATE '"&TEXT(K2, "yyyy-mm-dd")&"'")
>0,TRUE),FALSE)
(Please adjust ranges to your needs)
Functions used:
QUERY
Assuming this formula is used on row 2, this will work:
=ISBETWEEN($G$1,$B2,$C2)
Change $B2 and $C2 appropriately if you're not on row 2.
Note that the ISBETWEEN() function has two additional optional boolean parameters to control whether the start/end dates are inclusive or exclusive for the range; both default to TRUE for inclusive endpoints.
This question is a slightly varied version of this one...
Now I'm using Measures instead of Calculated columns and the date is static instead of having it based on a dropdown list.
Here's the Power BI test .pbix file:
https://drive.google.com/open?id=1OG7keqhdvDUDYkFQFMHyxcpi9Zi6Pn3d
This printscreen describes what I'm trying to accomplish:
Basically the date in P6 Update table is used as a cut date and will be fixed\static. It's imported from an Excel sheet where the user can customize it however they want.
Here's what should happen when a matching row in Test data table is found for P6 Update date:
column Earned Daily - must have its value summed with the next row if there's one;
column Earned Cum - must grab the next row's value;
all the previous rows should remain intact, that is, their values won't change;
all subsequent rows must have their values assigned 0.
So for example:
If P6 Update is 1-May-2018, this is the expected result:
1-May 7,498 52,106
2-May 0 0
If P6 Update is 30-Apr-2018, this is the expected result:
30-Apr 13,173 50,699
1-May 0 0
2-May 0 0
If P6 Update is 29-Apr-2018, this is the expected result:
29-Apr 11,906 44,608
30-Apr 0 0
1-May 0 0
2-May 0 0
and so on...
Hope this makes sense.
This is easier in Excel, but trying to do this in Power BI is making me go nuts.
I will ignore previously asked related questions and start from scratch.
First, create a measure:
Current Earn =
CALCULATE (
SUM( 'Test data'[Value]),
'Test data'[Act Rem] = "Actual Units",
'Test data'[Type] = "Current"
)
This measure will be used in other measures, to save you from typing all these conditions ("Actual Units" and "Current") again and again. It's a great practice to re-use measures in other measures - saves work, makes code cleaner and easier to refactor.
Create another measure:
Cut Date = SELECTEDVALUE('P6 Update'[Date])
We will use this measure whenever we need a cut off date. Please note that it does not have to be hard-coded - if P6 table contains a list of dates, you can create a pull-down slicer from the dates, and can choose the cut-off date dynamically. The formula will work properly.
Create third measure:
Next Earn =
VAR Cut_Date = [Cut Date]
VAR Current_Date = MAX ( 'Test data'[Date] )
VAR Next_Date = Current_Date + 1
VAR Current_Earn = [Current Earn]
VAR Next_Earn = CALCULATE ( [Current Earn], 'Test data'[Date] = Next_Date )
RETURN
SWITCH (
TRUE,
Current_Date < Cut_Date, Current_Earn,
Current_Date = Cut_Date, Current_Earn + Next_Earn,
BLANK ()
)
I am not sure if "Next Earn" is a good name for it, hopefully you will find a more intuitive name. The way it works: we save all necessary inputs into variables, and then use SWITCH function to define the results. Hopefully it's self-explanatory. (Note: if you need 0 above Cut Date, replace BLANK() with 0).
Finally, we define a measure for cumulative earn. It does not require any special logic, because previous measure takes care of it properly:
Cum Earn =
VAR Current_Date = MAX('Test data'[Date])
RETURN
CALCULATE(
[Next Earn],
FILTER(ALL('Test data'[Date]), 'Test data'[Date] <= Current_Date))
Result:
I want to count the dates. 1 date = 1, 2 dates = 2...
I have 2 dates and I want to prepare a formula if I have 2 dates, then this is total 2.
Adjust the range references to suit your data.
=COUNTA(C2:G2)
Where C2:G2 is your first row under datum. This equation will count the number of non blank cells.
If 4.9. is a number an not text, then you could also use
=COUNT(C2:G2)
In Excel you could create a new column that checks if the cell is a date by doing =ISERROR(DAY(A1)).
If it is a date the formula will return FALSE.
Then simply count all the cells with FALSE by doing =COUNTIF(B1:B10;FALSE)
Here B1:B10 should be replaced with the cellrange of your new column that holds the true or false values
My time comes back from a database query as following:
kdbstrbegtime =
09:15:00
kdbstrendtime =
15:00:00
or rather this is what it looks like in the command window.
I want to create a matrix with the number of rows equal to the number of seconds between the two timestamps. Are there time funcitons that make this easily possible?
Use datenum to convert both timestamps into serial numbers, and then subtract them to get the amount of seconds:
secs = fix((datenum(kdbstrendtime) - datenum(kdbstrbegtime)) * 86400)
Since the serial number is measured in days, the result should be multiplied by 86400 ( the number of seconds in one day). Then you can create a matrix with the number of rows equal to secs, e.g:
A = zeros(secs, 1)
I chose the number of columns to be 1, but this can be modified, of course.
First you have to convert kdbstrendtime and kdbstrbegtime to char by datestr command, then:
time = datenum(kdbstrendtime )-datenum(kdbstrbegtime )
t = datestr(time,'HH:MM:SS')
New to CR and use CR v10 and SQL Server 2000.
For the first record i.e Beginning Balance , the calculation is sum(field) from the input date, which I have calculated in SP as BegDateSum
But for the rest of the records under a group, the calculation should be previous(balance)+IN+OUT
Sample has been given:
Date Doc Descrip IN OUT Balance
Group Header-------- Beginning Balance-------------- 50 <---- sum(field) from my inputdate
3/2/2012 A -1 0 49 <-- (50+(-1)+0)
4/2/2012 B -2 0 47 <-- (49+(-2)+0)
5/2/2012 C 0 3 50
6/2/2012 D -2 3 51
How do I achieve this?
I am not sure whether to use running total, in case I have to how to do it.
A running total field won't work in this case, they are designed to add up (or count, or average, etc) one field and give you the sub-totals automatically. But, we can do some custom functions that will give the results you need. Assuming that your initial 50 is a static value, you would set a variable to that amount, and then add the IN and OUT values as you go along (printing that result of that).
First, initialize the value in the report header with a formula like:
WhilePrintingRecords;
Global NumberVar Balance;
Balance := 50;
""; //print nothing on the screen
Then, the formula to calculate and show the new balance, in the bar where the data is:
WhilePrintingRecords;
Global NumberVar Balance;
Balance := Balance + {tableName.IN} + {tableName.OUT};
The last line both calculates the new value, and tells what the result of the formula should be.
If the "50" is calculated somehow, then that will have to be done before the formula that calculates the new balance. If it is based off of the first record read in, you'll want to use a formula that includes If PreviousIsNull({tableName.Balance}) Then ..., that is usually a good indicator of the first record in the data set (unless that field can be null).