
have a custom year begin and end year table that the DDL section will
create. Thus, I use the t_w



1 of any year starting with the date in the w

last w


Is there a way I could return the same results created by my CODE section in
Northwind except use custom w


need a fix to properly sort the w


field.
CODE:
SELECT CAST(DATEPART(w

CAST(DATEPART(yyyy, OrderDate) AS char(4)) AS w

sumFreight
FROM Orders
GROUP BY CAST(DATEPART(w

CAST(DATEPART(yyyy, OrderDate) AS char(4))
ORDER BY CAST(DATEPART(w

CAST(DATEPART(yyyy, OrderDate) AS char(4))
DDL ****************************************
*****
USE [Northwind]
GO
CREATE TABLE [t_w

[w

[w

[w

[w

) ON [PRIMARY]
GO
insert into t_w




('19951226', '19961230', '1996')
insert into t_w




('19961231', '19971229', '1997')
insert into t_w




('19971230', '19981228', '1998')
insert into t_w




('19981229', '19981227', '1999')
insert into t_w




('19991228', '20001225', '2000')A sub-query, like
SELECT CAST(DATEDIFF(dd, (SELECT w


w

would get you the custom w

sub-queries in a GROUP BY clause. The solution here is to create a function.
The function below formats OrderDate into yyyy-ww
CREATE FUNCTION udfCustomW

RETURNS varchar(7)
AS
BEGIN
DECLARE @.output varchar(7)
SELECT @.output = CAST(DATEPART(yyyy, @.date) AS char(4)) + '-'
+ RIGHT('0' + CAST(DATEDIFF(dd, (SELECT w


WHERE w

RETURN @.output
END
You can then use the function to both group and order by
SELECT dbo.udfCustomW

FROM Orders
GROUP BY dbo.udfCustomW

ORDER BY dbo.udfCustomW

"Scott" wrote:
> In CODE section below, I'm grouping the Sum of Freight by the w

e
> have a custom year begin and end year table that the DDL section will
> create. Thus, I use the t_w


ek
> 1 of any year starting with the date in the w

he
> last w


> Is there a way I could return the same results created by my CODE section
in
> Northwind except use custom w


so
> need a fix to properly sort the w


r
> field.
>
> CODE:
> SELECT CAST(DATEPART(w

> CAST(DATEPART(yyyy, OrderDate) AS char(4)) AS w

> sumFreight
> FROM Orders
> GROUP BY CAST(DATEPART(w

> CAST(DATEPART(yyyy, OrderDate) AS char(4))
> ORDER BY CAST(DATEPART(w

> CAST(DATEPART(yyyy, OrderDate) AS char(4))
>
> DDL ****************************************
*****
> USE [Northwind]
> GO
> CREATE TABLE [t_w

> [w

> [w

> [w

> [w

> ) ON [PRIMARY]
> GO
> insert into t_w




s
> ('19951226', '19961230', '1996')
> insert into t_w




s
> ('19961231', '19971229', '1997')
> insert into t_w




s
> ('19971230', '19981228', '1998')
> insert into t_w




s
> ('19981229', '19981227', '1999')
> insert into t_w




s
> ('19991228', '20001225', '2000')
>
>
>|||You almost have it. Please run my DDL below (I simulated my production db).
The only thing wrong is for example at the end of 2004, your w

should be w


2005. otherwise, the w

w

I think this is happening because you aren't taking the year ending dates
into consideration.
DDL *********************************
CREATE TABLE [dbo].[test_prod](
[prod_id] [int] IDENTITY(1,1) NOT NULL,
[prod_date] [datetime] NULL,
[log_count] [int] NULL
) ON [PRIMARY]
CREATE TABLE [t_w

[w

[w

[w

[w

) ON [PRIMARY]
GO
insert into t_w




('19951226', '19961230', '1996')
insert into t_w




('19961231', '19971229', '1997')
insert into t_w




('19971230', '19981228', '1998')
insert into t_w




('19981229', '19981227', '1999')
insert into t_w




('19991228', '20001225', '2000')
CREATE FUNCTION udfW

RETURNS varchar(7)
AS
BEGIN
DECLARE @.output varchar(7)
SELECT @.output = CAST(DATEPART(yyyy, @.date) AS char(4)) + '-'
+ RIGHT('0' + CAST(DATEDIFF(dd, (SELECT w


WHERE w

RETURN @.output
END
insert into test_prod (prod_date, log_count) values
('20041220', '6456')
insert into test_prod (prod_date, log_count) values
('20041221', '5830')
insert into test_prod (prod_date, log_count) values
('20041222', '3480')
insert into test_prod (prod_date, log_count) values
('20041227', '6542')
insert into test_prod (prod_date, log_count) values
('20041228', '6669')
insert into test_prod (prod_date, log_count) values
('20041229', '6524')
insert into test_prod (prod_date, log_count) values
('20041230', '6541')
insert into test_prod (prod_date, log_count) values
('20050104', '6370')
insert into test_prod (prod_date, log_count) values
('20050105', '6926')
insert into test_prod (prod_date, log_count) values
('20050106', '5002')
insert into test_prod (prod_date, log_count) values
('20050107', '6736')
insert into test_prod (prod_date, log_count) values
('20050108', '5822')
-- execute to see results
SELECT dbo.udfW

FROM dbo.test_prod
GROUP BY dbo.udfW

ORDER BY dbo.udfW

"Mark Williams" <MarkWilliams@.discussions.microsoft.com> wrote in message
news:EBE692C6-1006-4E89-8ED9-985ED5F58F7B@.microsoft.com...
>A sub-query, like
> SELECT CAST(DATEDIFF(dd, (SELECT w


> w

> would get you the custom w

> sub-queries in a GROUP BY clause. The solution here is to create a
> function.
> The function below formats OrderDate into yyyy-ww
> CREATE FUNCTION udfCustomW

> RETURNS varchar(7)
> AS
> BEGIN
> DECLARE @.output varchar(7)
> SELECT @.output = CAST(DATEPART(yyyy, @.date) AS char(4)) + '-'
> + RIGHT('0' + CAST(DATEDIFF(dd, (SELECT w


> WHERE w

> RETURN @.output
> END
> You can then use the function to both group and order by
> SELECT dbo.udfCustomW

> FROM Orders
> GROUP BY dbo.udfCustomW

> ORDER BY dbo.udfCustomW

> "Scott" wrote:
>|||Yep, I realized my mistake about 15 minutes after my post, but couldn't get
back to it until after a few hours. This should do it:
DROP FUNCTION udfCustomW

GO
CREATE FUNCTION udfCustomW

RETURNS varchar(7)
AS
BEGIN
DECLARE @.output varchar(7)
SELECT @.output = CAST(w

+ RIGHT('0' + CAST(DATEDIFF(dd, w

varchar(3)), 2)
FROM t_w



RETURN @.output
END
SELECT dbo.udfCustomW

FROM Orders
GROUP BY dbo.udfCustomW

ORDER BY dbo.udfCustomW

The function should now pick up the dates in late December correctly. For
example,
select dbo.udfCustomW

Your example t_w

a table that has dates in 2005; is the table cyclic?
"Scott" wrote:
> You almost have it. Please run my DDL below (I simulated my production db)
.
> The only thing wrong is for example at the end of 2004, your w

> should be w


> 2005. otherwise, the w

> w

> I think this is happening because you aren't taking the year ending dates
> into consideration.
> DDL *********************************
> CREATE TABLE [dbo].[test_prod](
> [prod_id] [int] IDENTITY(1,1) NOT NULL,
> [prod_date] [datetime] NULL,
> [log_count] [int] NULL
> ) ON [PRIMARY]
>
> CREATE TABLE [t_w

> [w

> [w

> [w

> [w

> ) ON [PRIMARY]
> GO
> insert into t_w




s
> ('19951226', '19961230', '1996')
> insert into t_w




s
> ('19961231', '19971229', '1997')
> insert into t_w




s
> ('19971230', '19981228', '1998')
> insert into t_w




s
> ('19981229', '19981227', '1999')
> insert into t_w




s
> ('19991228', '20001225', '2000')
> CREATE FUNCTION udfW

> RETURNS varchar(7)
> AS
> BEGIN
> DECLARE @.output varchar(7)
> SELECT @.output = CAST(DATEPART(yyyy, @.date) AS char(4)) + '-'
> + RIGHT('0' + CAST(DATEDIFF(dd, (SELECT w


> WHERE w

> RETURN @.output
> END
> insert into test_prod (prod_date, log_count) values
> ('20041220', '6456')
> insert into test_prod (prod_date, log_count) values
> ('20041221', '5830')
> insert into test_prod (prod_date, log_count) values
> ('20041222', '3480')
> insert into test_prod (prod_date, log_count) values
> ('20041227', '6542')
> insert into test_prod (prod_date, log_count) values
> ('20041228', '6669')
> insert into test_prod (prod_date, log_count) values
> ('20041229', '6524')
> insert into test_prod (prod_date, log_count) values
> ('20041230', '6541')
> insert into test_prod (prod_date, log_count) values
> ('20050104', '6370')
> insert into test_prod (prod_date, log_count) values
> ('20050105', '6926')
> insert into test_prod (prod_date, log_count) values
> ('20050106', '5002')
> insert into test_prod (prod_date, log_count) values
> ('20050107', '6736')
> insert into test_prod (prod_date, log_count) values
> ('20050108', '5822')
>
> -- execute to see results
> SELECT dbo.udfW

> FROM dbo.test_prod
> GROUP BY dbo.udfW

> ORDER BY dbo.udfW

>
> "Mark Williams" <MarkWilliams@.discussions.microsoft.com> wrote in message
> news:EBE692C6-1006-4E89-8ED9-985ED5F58F7B@.microsoft.com...
>
>|||First, thanks big for solving this head-hurter. My t_w

the last 5 years plus always 1 year in advance. I had the old years so it'd
work in northwind.
what did you mean by the table being "cyclic"?
"Mark Williams" <MarkWilliams@.discussions.microsoft.com> wrote in message
news:602D1125-A792-40A5-B505-7B31B7524A94@.microsoft.com...
> Yep, I realized my mistake about 15 minutes after my post, but couldn't
> get
> back to it until after a few hours. This should do it:
> DROP FUNCTION udfCustomW

> GO
> CREATE FUNCTION udfCustomW

> RETURNS varchar(7)
> AS
> BEGIN
> DECLARE @.output varchar(7)
> SELECT @.output = CAST(w

> + RIGHT('0' + CAST(DATEDIFF(dd, w

> varchar(3)), 2)
> FROM t_w



> RETURN @.output
> END
> SELECT dbo.udfCustomW

> FROM Orders
> GROUP BY dbo.udfCustomW

> ORDER BY dbo.udfCustomW

> The function should now pick up the dates in late December correctly. For
> example,
> select dbo.udfCustomW

> Your example t_w

> against
> a table that has dates in 2005; is the table cyclic?
> "Scott" wrote:
>|||Just curious - what kind of w

William Stacey [MVP]
"Scott" <sbailey@.mileslumber.com> wrote in message
news:%23UoMFlnCGHA.3876@.tk2msftngp13.phx.gbl...
> In CODE section below, I'm grouping the Sum of Freight by the w

> We have a custom year begin and end year table that the DDL section will
> create. Thus, I use the t_w


> w


> and the last w


> Is there a way I could return the same results created by my CODE section
> in Northwind except use custom w


> also need a fix to properly sort the w

> w

>
> CODE:
> SELECT CAST(DATEPART(w

> CAST(DATEPART(yyyy, OrderDate) AS char(4)) AS w

> sumFreight
> FROM Orders
> GROUP BY CAST(DATEPART(w

> CAST(DATEPART(yyyy, OrderDate) AS char(4))
> ORDER BY CAST(DATEPART(w

> CAST(DATEPART(yyyy, OrderDate) AS char(4))
>
> DDL ****************************************
*****
> USE [Northwind]
> GO
> CREATE TABLE [t_w

> [w

> [w

> [w

> [w

> ) ON [PRIMARY]
> GO
> insert into t_w




> values
> ('19951226', '19961230', '1996')
> insert into t_w




> values
> ('19961231', '19971229', '1997')
> insert into t_w




> values
> ('19971230', '19981228', '1998')
> insert into t_w




> values
> ('19981229', '19981227', '1999')
> insert into t_w




> values
> ('19991228', '20001225', '2000')
>
>
>|||That the start and end year dates repeat in a pattern, every 5 years or so.
I
got from your second post that you were adjusting your data to fit Northwind
so a solution could be tested (and that's appreciated!)
I noticed when I ran the query against Northwind, one of the years (1996 I
think) shows up as having 53 w

start date and end date for 1996 in your sample is 370 days, so that does go
beying 52 w

the year being in w


an adjusted version later.
"scott" wrote:
> First, thanks big for solving this head-hurter. My t_w

> the last 5 years plus always 1 year in advance. I had the old years so it'
d
> work in northwind.
> what did you mean by the table being "cyclic"?
>
> "Mark Williams" <MarkWilliams@.discussions.microsoft.com> wrote in message
> news:602D1125-A792-40A5-B505-7B31B7524A94@.microsoft.com...
>
>|||Should have been this way from the start.
CREATE FUNCTION udfCustomW

RETURNS varchar(7)
AS
BEGIN
DECLARE @.output varchar(7)
SELECT @.output = CAST(w

+ RIGHT('0' + CAST(CEILING(DATEDIFF(dd, w

AS
varchar(3)), 2)
FROM t_w



RETURN @.output
END
Now the last (364th) day of the year shows up as being in w

that go beyond 364 days, you will still end up with a w

function.
"scott" wrote:
> First, thanks big for solving this head-hurter. My t_w

> the last 5 years plus always 1 year in advance. I had the old years so it'
d
> work in northwind.
> what did you mean by the table being "cyclic"?
>
> "Mark Williams" <MarkWilliams@.discussions.microsoft.com> wrote in message
> news:602D1125-A792-40A5-B505-7B31B7524A94@.microsoft.com...
>
>|||Are these calendar w

William Stacey [MVP]
"Scott" <sbailey@.mileslumber.com> wrote in message
news:%23UoMFlnCGHA.3876@.tk2msftngp13.phx.gbl...
> In CODE section below, I'm grouping the Sum of Freight by the w

> We have a custom year begin and end year table that the DDL section will
> create. Thus, I use the t_w


> w


> and the last w


> Is there a way I could return the same results created by my CODE section
> in Northwind except use custom w


> also need a fix to properly sort the w

> w

>
> CODE:
> SELECT CAST(DATEPART(w

> CAST(DATEPART(yyyy, OrderDate) AS char(4)) AS w

> sumFreight
> FROM Orders
> GROUP BY CAST(DATEPART(w

> CAST(DATEPART(yyyy, OrderDate) AS char(4))
> ORDER BY CAST(DATEPART(w

> CAST(DATEPART(yyyy, OrderDate) AS char(4))
>
> DDL ****************************************
*****
> USE [Northwind]
> GO
> CREATE TABLE [t_w

> [w

> [w

> [w

> [w

> ) ON [PRIMARY]
> GO
> insert into t_w




> values
> ('19951226', '19961230', '1996')
> insert into t_w




> values
> ('19961231', '19971229', '1997')
> insert into t_w




> values
> ('19971230', '19981228', '1998')
> insert into t_w




> values
> ('19981229', '19981227', '1999')
> insert into t_w




> values
> ('19991228', '20001225', '2000')
>
>
>|||what's the difference in this 2nd correct function and the 1st or previous
correct function?
"Mark Williams" <MarkWilliams@.discussions.microsoft.com> wrote in message
news:D4583358-03D7-4EAD-9B4C-F1E69B884861@.microsoft.com...
> Should have been this way from the start.
> CREATE FUNCTION udfCustomW

> RETURNS varchar(7)
> AS
> BEGIN
> DECLARE @.output varchar(7)
> SELECT @.output = CAST(w

> + RIGHT('0' + CAST(CEILING(DATEDIFF(dd, w

> AS
> varchar(3)), 2)
> FROM t_w



> RETURN @.output
> END
> Now the last (364th) day of the year shows up as being in w

> years
> that go beyond 364 days, you will still end up with a w

> function.
> "scott" wrote:
>
No comments:
Post a Comment