SQL language for complex sum

A

AK177

Hi, I am trying to write SQL language for a complex sum query. I have a
dataset with many columns, including PRECIP (precipitation for a specific
month), MON (month), YEAR, and HRU. I want to find the total PRECIP between
June and August (where MON between 6 and 8) for each HRU within each year.
For example, for HRU=1 and YEAR=2002, I want to determine total PRECIP where
MON between 6 and 8. I also want to determine total PRECIP for HRU=1 and
YEAR=2003...and total PRECIP for HRU=2 and YEAR=2002, etc, etc.

Can you help me with writing the proper language for this?

Thanks
 
K

KARL DEWEY

Try this --
SELECT YEAR, MON, HRU, Sum([PRECIP]) AS Precipitation
FROM YourTable
WHERE MON Between 6 And 8
GROUP BY YEAR, MON, HRU;
 
D

Dirk Goldgar

AK177 said:
Hi, I am trying to write SQL language for a complex sum query. I have a
dataset with many columns, including PRECIP (precipitation for a specific
month), MON (month), YEAR, and HRU. I want to find the total PRECIP
between
June and August (where MON between 6 and 8) for each HRU within each year.
For example, for HRU=1 and YEAR=2002, I want to determine total PRECIP
where
MON between 6 and 8. I also want to determine total PRECIP for HRU=1 and
YEAR=2003...and total PRECIP for HRU=2 and YEAR=2002, etc, etc.

Can you help me with writing the proper language for this?

Thanks


It sounds like your SQLshould be something like this:

SELECT
[YEAR],
HRU,
Sum(PRECIP) As TotalPrecip
FROM [YourTable]
WHERE MON Between 6 And 8
GROUP BY
[YEAR],
HRU;

Because YEAR is a reserved word, it *may* be necessary to prefix it with a
table qualifier -- [YourTable].[YEAR] -- but I'm not sure about that.
 
A

AK177

Thanks, this was very helpful. The SQL I used was:
Select YEAR, HRU, Sum([PRECIPmm]) As Precipitation
from [mytable]
where (MON Between 6 and 8)
Group by YEAR, HRU

Now, I have another question. I want to do a similar query on my table, but
this time I want to sum seasonal snowfall. This means I need to group by
seasons rather than by year but ofcourse I only have a month field not a
season field. So, I want to group by months Nov of one year to May of the
next year and get the sum of snowfall for this time period/season between
1998 and 2008.


Dirk Goldgar said:
AK177 said:
Hi, I am trying to write SQL language for a complex sum query. I have a
dataset with many columns, including PRECIP (precipitation for a specific
month), MON (month), YEAR, and HRU. I want to find the total PRECIP
between
June and August (where MON between 6 and 8) for each HRU within each year.
For example, for HRU=1 and YEAR=2002, I want to determine total PRECIP
where
MON between 6 and 8. I also want to determine total PRECIP for HRU=1 and
YEAR=2003...and total PRECIP for HRU=2 and YEAR=2002, etc, etc.

Can you help me with writing the proper language for this?

Thanks


It sounds like your SQLshould be something like this:

SELECT
[YEAR],
HRU,
Sum(PRECIP) As TotalPrecip
FROM [YourTable]
WHERE MON Between 6 And 8
GROUP BY
[YEAR],
HRU;

Because YEAR is a reserved word, it *may* be necessary to prefix it with a
table qualifier -- [YourTable].[YEAR] -- but I'm not sure about that.

--
Dirk Goldgar, MS Access MVP
www.datagnostics.com

(please reply to the newsgroup)
 
J

John W. Vinson

Thanks, this was very helpful. The SQL I used was:
Select YEAR, HRU, Sum([PRECIPmm]) As Precipitation
from [mytable]
where (MON Between 6 and 8)
Group by YEAR, HRU

Now, I have another question. I want to do a similar query on my table, but
this time I want to sum seasonal snowfall. This means I need to group by
seasons rather than by year but ofcourse I only have a month field not a
season field. So, I want to group by months Nov of one year to May of the
next year and get the sum of snowfall for this time period/season between
1998 and 2008.

This would be one heck of a lot easier if you had a date/time field (with the
1st of each month) rather than separate fields, but...


SELECT [Year], [HRU], Sum([PRECIPmm]) <<< or your snowfall field
FROM
(SELECT [Year], [HRU], [PRECIPmm]
FROM mytable
WHERE [MON] IN (11, 12)
AND [Year] >= 1998
UNION ALL
SELECT [Year] - 1, [HRU], [PRECIPmm]
FROM mytable
WHERE [MON] IN (1, 2, 3, 4, 5)
AND [Year] >= 1999)

The UNION query will combine November-December from each year with January-May
from the *NEXT* year, so (say) February 2001 data will be combined with
December 2000 data, and displayed in the total as "the winter of 2000".
 
A

AK177

Agreed, it would be easier if I had date/time in one field, but that's not
how the data was given to me.

This is a good start, but not quite right. ..
How do I get a field for the season (e.g. "the winter of 2000" as you
mentioned) - the sql you provided selects Year but Year is not relevant in
the final query; I need WinterSeason or something.

Also, I'm not quite sure I understand the Year-1 statement. Won't this just
union year 1998 with year 1998 because it has "added" a year with "where
year>=1999) but "subtracted" a year with year-1?

Btw, I added
Group by HRU
(and will need to add another Group by WinterSeason)

Thanks.

John W. Vinson said:
Thanks, this was very helpful. The SQL I used was:
Select YEAR, HRU, Sum([PRECIPmm]) As Precipitation
from [mytable]
where (MON Between 6 and 8)
Group by YEAR, HRU

Now, I have another question. I want to do a similar query on my table, but
this time I want to sum seasonal snowfall. This means I need to group by
seasons rather than by year but ofcourse I only have a month field not a
season field. So, I want to group by months Nov of one year to May of the
next year and get the sum of snowfall for this time period/season between
1998 and 2008.

This would be one heck of a lot easier if you had a date/time field (with the
1st of each month) rather than separate fields, but...


SELECT [Year], [HRU], Sum([PRECIPmm]) <<< or your snowfall field
FROM
(SELECT [Year], [HRU], [PRECIPmm]
FROM mytable
WHERE [MON] IN (11, 12)
AND [Year] >= 1998
UNION ALL
SELECT [Year] - 1, [HRU], [PRECIPmm]
FROM mytable
WHERE [MON] IN (1, 2, 3, 4, 5)
AND [Year] >= 1999)

The UNION query will combine November-December from each year with January-May
from the *NEXT* year, so (say) February 2001 data will be combined with
December 2000 data, and displayed in the total as "the winter of 2000".
 
J

John W. Vinson

Agreed, it would be easier if I had date/time in one field, but that's not
how the data was given to me.

This is a good start, but not quite right. ..
How do I get a field for the season (e.g. "the winter of 2000" as you
mentioned) - the sql you provided selects Year but Year is not relevant in
the final query; I need WinterSeason or something.

Also, I'm not quite sure I understand the Year-1 statement. Won't this just
union year 1998 with year 1998 because it has "added" a year with "where
year>=1999) but "subtracted" a year with year-1?

The "Year" field in the UNION query is indeed the "winter season". The first
SELECT clause of the UNION query selects (say) November and December of 2000.
The second clause selects January through May of 2001, and the -1 lets you
combine that 2001 data with the 2000 data. You could alias the field as
WinterSeason if you want:

SELECT [WinterSeason], [HRU], Sum([PRECIPmm])
FROM
(SELECT [Year] AS WinterSeason, [HRU], [PRECIPmm]
FROM mytable
WHERE [MON] IN (11, 12)
AND [Year] >= 1998
UNION ALL
SELECT [Year] - 1 AS WinterSeason, [HRU], [PRECIPmm]
FROM mytable
WHERE [MON] IN (1, 2, 3, 4, 5)
AND [Year] >= 1999)
 
A

AK177

Thanks, I really appreciate all your help!

John W. Vinson said:
Agreed, it would be easier if I had date/time in one field, but that's not
how the data was given to me.

This is a good start, but not quite right. ..
How do I get a field for the season (e.g. "the winter of 2000" as you
mentioned) - the sql you provided selects Year but Year is not relevant in
the final query; I need WinterSeason or something.

Also, I'm not quite sure I understand the Year-1 statement. Won't this just
union year 1998 with year 1998 because it has "added" a year with "where
year>=1999) but "subtracted" a year with year-1?

The "Year" field in the UNION query is indeed the "winter season". The first
SELECT clause of the UNION query selects (say) November and December of 2000.
The second clause selects January through May of 2001, and the -1 lets you
combine that 2001 data with the 2000 data. You could alias the field as
WinterSeason if you want:

SELECT [WinterSeason], [HRU], Sum([PRECIPmm])
FROM
(SELECT [Year] AS WinterSeason, [HRU], [PRECIPmm]
FROM mytable
WHERE [MON] IN (11, 12)
AND [Year] >= 1998
UNION ALL
SELECT [Year] - 1 AS WinterSeason, [HRU], [PRECIPmm]
FROM mytable
WHERE [MON] IN (1, 2, 3, 4, 5)
AND [Year] >= 1999)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top