[Webinar] Learn how to a build a cloud-first strategyRegister Now

x
?
Solved

Group by Week Ending Monday through Sunday in a Cross-Tab Object

Posted on 2009-02-18
5
Medium Priority
?
1,045 Views
Last Modified: 2012-05-06
I'm trying to create a reports that summarizes sales and groups by year, then by month. Within the month grouping I would like to have a cross-tab with columns for each week ending Sunday or the last day of the month, whichever comes first in that particular week. For instance, in January 2009 there would be columns for 1/4/2009, 1/11/2009, 1/18/2009, 1/25/2009, and 1/31/2009 (I would want to display the last day in the period for the column label). I tried to group on a formula contributed by bdreed35 to a previous question I asked (see code snippit), but it doesn't seem to function correctly when used in a cross-tab. It seems to display the week ending Saturdays instead.
//@WeekEndDate
local datevar input := {@DateKey};
if dayofweek(input) in 2 to 7
then input + (8 - dayofweek(input))
else input

Open in new window

0
Comment
Question by:gsszuber
  • 3
  • 2
5 Comments
 
LVL 35

Accepted Solution

by:
James0628 earned 2000 total points
ID: 23677259
The formula looks OK.  It seems like it should give you the next Sunday, and I can't think of any reason why you'd get different results in a cross-tab.  Have you tried putting the formula somewhere on the report, just to make sure that it's giving you the correct dates?  (Kind of a desperation move, really, since I really think the formula should work)

 Putting that aside for the moment, you also need to change the formula to not advance past the last day of the month.  I think the following will work (ignoring the problem that you're having in the cross-tab):

//@WeekEndDate
local datevar input := {@DateKey};
if dayofweek(input) in 2 to 7
then input := input + (8 - dayofweek(input));

if Month (input) <> Month ({@DateKey}) then
  input := Date (DateAdd ("d", -1, Date (Year (input), Month (input), 1)));

input


 That seems to work here, but I didn't try it in a cross-tab.

 James
0
 

Author Comment

by:gsszuber
ID: 23681683
Indeed, when I group by @DateKey in the report itself, not in a cross-tab, it outputs each Sunday. Then again, I'm not sure whether it's displaying the first or last day of the week... I don't see an option of which to display when grouping in the report.

That being said, I just thought of another approach that should work. I was thinking I could create a SQL Command that would add a calculated column to the table that would simply be the week-endinding Sunday date that that particular day belongs in. The logic should work something like this:

1. Is the date a Sunday? If yes, output the same date.
2. If no, is the next Sunday in the same month? If yes, output the next Sunday.
3. If no, output the last day of the month.

Then I could group on this calulated column and it should produce the desired result. Would you agree?
0
 
LVL 35

Expert Comment

by:James0628
ID: 23687956
What does @DateKey produce?  Could it be any date, or is it another formula designed to only produce certain dates (eg. only a certain day of the week)?

 Assuming that it's not restricted in some way, if you're grouping by @DateKey and you're getting groups for each Sunday, I assume that you have the report set to group by week.  That seems to use the default week of Sunday - Saturday and the date shown for the group is from the start of each week.  I don't see any way to change either of those (although there may be something that I'm not aware of).

 However, that also seems pretty irrelevant.  The point was to have the @WeekEndDate formula produce the dates you needed and group by that.  It doesn't really matter what you get when you group by @DateKey.  All that matters is that @DateKey produces the correct dates, and isn't doing some manipulating of its own, like altering the dates to get a certain day of the week.  If it's altering the dates, then that might affect how, or if, you can use it in the @WeekEndDate formula.

 Getting back to the @WeekEndDate formula:

 I took the version that I posted and tried it here and it worked fine as the columns in a cross-tab (and, FWIW, as a group on the report).  For example, when I included all of January, the dates I got were 01/04, 01/11, 01/18, 01/25 and 01/31 (01/31 was a Saturday).  For the Group Options for that group in the cross-tab, I selected:

 "The column will be printed:"
  "for each day"

 "The value printed for the column will be:"
  "the first date in the period"

 Technically, the second one shouldn't matter.  The choices are "first date" or "last date" and since I used "for each day", each group only has one date, so the results should be the same either way.

 So, depending on what's in @DateKey, @WeekEndDate should work.

 You could do this in SQL, using code very similar to what I posted.  But you shouldn't have to.  The formula that I posted should work.

 James
0
 

Author Comment

by:gsszuber
ID: 23715918
@DateKey is simply a formula that converts the a date column from YYYYMMDD to an actual date.

For whatever reason, when I replaced the formula I started with for @WeekEndDate with yours, everything behaves the way I would like! I'm not going to argue with that. I'm going to give you full credit for the solution.

In the meantime, I also solved this using a SQL Command, so I'm going to post my solution as well for all the other Expert Exchange readers. It's a little convoluted, but it worked for me. This is the SQL just for the calculated field called 'WeekEnding' that you will be able to group by and get the same result as with James' solution. It does have the benefit of maybe some additional server-side processing, but I couldn't tell a difference between the two on my report.
SELECT
CASE
WHEN DATEPART(WEEKDAY, DateField) = '1' THEN DateField
WHEN DATEPART(WEEKDAY, DateField) = '2' THEN 
	CASE WHEN (DATEADD(mm,1,DateField - day(DateField)+1)-1) <
	(DATEADD(dd, 6, DateField)) THEN
	(DATEADD(mm,1,DateField - day(DateField)+1)-1) ELSE
	(DATEADD(dd, 6, DateField)) END
WHEN DATEPART(WEEKDAY, DateField) = '3' THEN
	CASE WHEN (DATEADD(mm,1,DateField - day(DateField)+1)-1) <
	(DATEADD(dd, 5, DateField)) THEN
	(DATEADD(mm,1,DateField - day(DateField)+1)-1) ELSE
	(DATEADD(dd, 5, DateField)) END
WHEN DATEPART(WEEKDAY, DateField) = '4' THEN
	CASE WHEN (DATEADD(mm,1,DateField - day(DateField)+1)-1) <
	(DATEADD(dd, 4, DateField)) THEN
	(DATEADD(mm,1,DateField - day(DateField)+1)-1) ELSE
	(DATEADD(dd, 4, DateField)) END
WHEN DATEPART(WEEKDAY, DateField) = '5' THEN
	CASE WHEN (DATEADD(mm,1,DateField - day(DateField)+1)-1) <
	(DATEADD(dd, 3, DateField)) THEN
	(DATEADD(mm,1,DateField - day(DateField)+1)-1) ELSE
	(DATEADD(dd, 3, DateField)) END
WHEN DATEPART(WEEKDAY, DateField) = '6' THEN
	CASE WHEN (DATEADD(mm,1,DateField - day(DateField)+1)-1) <
	(DATEADD(dd, 2, DateField)) THEN
	(DATEADD(mm,1,DateField - day(DateField)+1)-1) ELSE
	(DATEADD(dd, 2, DateField)) END
WHEN DATEPART(WEEKDAY, DateField) = '7' THEN
	CASE WHEN (DATEADD(mm,1,DateField - day(DateField)+1)-1) <
	(DATEADD(dd, 1, DateField)) THEN
	(DATEADD(mm,1,DateField - day(DateField)+1)-1) ELSE
	(DATEADD(dd, 1, DateField)) END
END AS 'WeekEnding'
FROM TableName

Open in new window

0
 
LVL 35

Expert Comment

by:James0628
ID: 23717689
I don't know.  Like I said, apart from not handling the end of the month, your formula looked like it should work.  About the only thing I can think of is that you had the cross-tab set to group by the week, instead of the day, and it was showing you the last day of the week (Saturday).

 Thanks for posting that code.

 James
0

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Crystal Reports: 5 Tests for Top Performance It is complete, your masterpiece report.  Not only does it meet your customer’s expectations, it blows them out the water, all they want is beautifully summarised and displayed in a myriad of ways. …
Hot fix for .Net Crystal Reports 10.2.3600.0 to fix problems with sub reports running on 64 bit operating systems ISSUE: Reports which contain subreports fail with error "Missing Parameter Value" DEPLOYMENT SERVER OS: Windows 2008 with 64 bi…
This lesson discusses how to use a Mainform + Subforms in Microsoft Access to find and enter data for payments on orders. The sample data comes from a custom shop that builds and sells movable storage structures that are delivered to your property. …
Look below the covers at a subform control , and the form that is inside it. Explore properties and see how easy it is to aggregate, get statistics, and synchronize results for your data. A Microsoft Access subform is used to show relevant calcul…
Suggested Courses
Course of the Month20 days, 10 hours left to enroll

867 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question