Posted: Thu Sep 30, 2004 7:27 am Post subject: remnent from SQL Challenge Question 1
Hi all,
Before I start, thanks to Kolusu, for the good SQL Challenge Question 1. I used it in multiple examples. One visualization is getting complicated. I do not know, If I can get the output the desired way.
Query:
Code:
SELECT DISTINCT C.ID
,SUM(CASE WHEN MN = 1 THEN C.CNT ELSE 0 END) AS JAN
,SUM(CASE WHEN MN = 2 THEN C.CNT ELSE 0 END) AS FEB
,SUM(CASE WHEN MN = 3 THEN C.CNT ELSE 0 END) AS MAR
,SUM(CASE WHEN MN = 4 THEN C.CNT ELSE 0 END) AS APR
,SUM(CASE WHEN MN = 5 THEN C.CNT ELSE 0 END) AS MAY
,SUM(CASE WHEN MN = 6 THEN C.CNT ELSE 0 END) AS JUN
,SUM(CASE WHEN MN = 7 THEN C.CNT ELSE 0 END) AS JUL
,SUM(CASE WHEN MN = 8 THEN C.CNT ELSE 0 END) AS AUG
,SUM(CASE WHEN MN = 9 THEN C.CNT ELSE 0 END) AS SEP
,SUM(CASE WHEN MN = 10 THEN C.CNT ELSE 0 END) AS OCT
,SUM(CASE WHEN MN = 11 THEN C.CNT ELSE 0 END) AS NOV
,SUM(CASE WHEN MN = 12 THEN C.CNT ELSE 0 END) AS DEC
FROM (SELECT ITSSADLP_ID_RACF AS ID
,ITSSADLP_REG_TAB AS REG
,COUNT (ITSSADLP_ID_RACF) AS CNT
,YEAR (ITSSADLP_STAT_TS) AS YR
,MONTH (ITSSADLP_STAT_TS) AS MN
FROM SCITST.ITSSADLP
GROUP BY ITSSADLP_ID_RACF, ITSSADLP_REG_TAB, ITSSADLP_STAT_TS ) C
GROUP BY C.ID
ORDER BY C.ID
The Desired out I needed was
for the last 12 months. i.e from 09/29/04 to 10/01/2004. The output counts are ok. Output should start monthwise from 2004-sept, 2004-Aug,.. so on till 2003-Sep. Is it possibl to get. The SQL should be able to automatedly alighn the counts with current month in first Column, and Oct 2003 in last column.
Question 2: If I have to calculate the start date from 1 year from today, but avoiding the current month, i.e Date between 09/29/2004 thre 10/01/2004. or 10/16/2004 thru 11/01/2004. Is it thru Cobol manupulation or SQL has some logic to provide date ranges for last months in year.
Joined: 26 Nov 2002 Posts: 12378 Topics: 75 Location: San Jose
Posted: Thu Sep 30, 2004 8:09 am Post subject:
Satya reddy,
Quote:
Question 2: If I have to calculate the start date from 1 year from today, but avoiding the current month, i.e Date between 09/29/2004 thre 10/01/2004. or 10/16/2004 thru 11/01/2004. Is it thru Cobol manupulation or SQL has some logic to provide date ranges for last months in year.
Satya your dates are all messed up. I am confused with your date range. I am taking you wanted to get
Code:
If I have to calculate the start date from 1 year from today, but avoiding the current month
The following sql will give you the date range
Code:
SELECT
DATE(LAST_DAY(CURRENT DATE) + 1 DAY)
,DATE(LAST_DAY(CURRENT DATE) + 1 DAY + 1 YEAR)
FROM SYSIBM.SYSDUMMY1
;
The output is :
Code:
2004-10-01 2005-10-01
As for your first question, I am still trying to understand your requirement.
Let us say your table has 2 columns ID & date and here is a sample data
Code:
ID DATE
==== ==========
KEY1 2003-10-10
KEY1 2003-10-11
KEY1 2003-10-12
KEY1 2004-01-01
KEY1 2004-02-01
KEY1 2004-09-28
Key1 has 3 records in oct of 2003. so mon 12 will have 3
key1 has 1 record in Jan 2004, so mon 8 will have 1
key1 has 1 record in feb 2004, so mon 7 will have 1
key1 has 1 record in sep 2004, so mon 1 will have 1
simlarly for key2..
Let me know if this what you wanted. If it is different then please try to show me an example of the data as I have shown.
Thanks Kolusu. I wanted the data for the last 12 months, beginning from the current month. The query, I am trying to test is as below.
SELECT C.ID
,SUM(CASE WHEN MN = (CURRENT MONTH) THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = (CUR MON - 1 MON) THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = (CUR MON - 2 MON) THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = (CUR MON - 3 MON) THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = (CUR MON - 4 MON) THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = (CUR MON - 5 MON) THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = (CUR MON - 6 MON) THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = (CUR MON - 7 MON) THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = (CUR MON - 8 MON) THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = (CUR MON - 9 MON) THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = (CUR MON - 10 MON) THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = (CUR MON - 11 MON) THEN C.CNT ELSE 0 END)
FROM (SELECT ITSSADLP_ID_RACF AS ID
,ITSSADLP_REG_TAB AS REG
,COUNT (ITSSADLP_ID_RACF) AS CNT
,YEAR (ITSSADLP_STAT_TS) AS YR
,MONTH (ITSSADLP_STAT_TS) AS MN
FROM SCITST.ITSSADLP
GROUP BY ITSSADLP_ID_RACF, ITSSADLP_REG_TAB, ITSSADLP_STAT_TS ) C
GROUP BY C.ID
ORDER BY C.ID
This is same as what you specified, but months go back, as 2004/SEPT, 2004/AUG, 2004/JUL, 2004/JUN, 2004/MAY, 2004/APR, 2004/MAR, 2004/FEB, 2004/JAN, 2003/DEC, 2003/NOV, 2003/OCT. I shall also put it per your example.
Mon 1 is 2004/OCT
Mon 2 is 2004/SEPT
Mon 3 is 2004/AUG
Mon 4 is 2004/JUL
Mon 5 is 2004/JUN
Mon 6 is 2004/MAY
Mon 7 is 2004/APR
Mon 8 is 2004/MAR
Mon 9 is 2004/FEB
Mon 10 is 2004/JAN
Mon 11 is 2003/DEC
Mon 12 is 2003/NOV
I am able to get the output, if I hardcode month, but if I want to let SQL identify the months itself, I am ending up in errors.
For Ex. ,SUM(CASE WHEN MN = (CURRENT MONTH) THEN C.CNT ELSE 0 END) or ,SUM(CASE WHEN MN = (CURRENT MONTH - 1 month) THEN C.CNT ELSE 0 END). SQL is not accepting the syntax MN = (CURRENT MONTH), but it allows MN = 1. Can you help in correcting my syntax.
Joined: 26 Nov 2002 Posts: 12378 Topics: 75 Location: San Jose
Posted: Fri Oct 01, 2004 9:01 am Post subject:
Satya_reddy,
I am not sure how efficient the following query is but here is sql. I assumed that your table has 2 columns.
Code:
ID
ORD_DATE
Code:
SELECT ID
,SUM(CASE WHEN ORD_DATE BETWEEN
DATE(LAST_DAY(CURRENT DATE - 1 MONTH) + 1 DAY) AND
LAST_DAY(CURRENT DATE- 0 MONTH) THEN 1 ELSE 0 END) AS MON01
,SUM(CASE WHEN ORD_DATE BETWEEN
DATE(LAST_DAY(CURRENT DATE - 2 MONTH) + 1 DAY) AND
LAST_DAY(CURRENT DATE- 1 MONTH) THEN 1 ELSE 0 END) AS MON02
,SUM(CASE WHEN ORD_DATE BETWEEN
DATE(LAST_DAY(CURRENT DATE - 3 MONTH) + 1 DAY) AND
LAST_DAY(CURRENT DATE- 2 MONTH) THEN 1 ELSE 0 END) AS MON03
,SUM(CASE WHEN ORD_DATE BETWEEN
DATE(LAST_DAY(CURRENT DATE - 4 MONTH) + 1 DAY) AND
LAST_DAY(CURRENT DATE- 3 MONTH) THEN 1 ELSE 0 END) AS MON04
,SUM(CASE WHEN ORD_DATE BETWEEN
DATE(LAST_DAY(CURRENT DATE - 5 MONTH) + 1 DAY) AND
LAST_DAY(CURRENT DATE- 4 MONTH) THEN 1 ELSE 0 END) AS MON05
,SUM(CASE WHEN ORD_DATE BETWEEN
DATE(LAST_DAY(CURRENT DATE - 6 MONTH) + 1 DAY) AND
LAST_DAY(CURRENT DATE- 5 MONTH) THEN 1 ELSE 0 END) AS MON06
,SUM(CASE WHEN ORD_DATE BETWEEN
DATE(LAST_DAY(CURRENT DATE - 7 MONTH) + 1 DAY) AND
LAST_DAY(CURRENT DATE- 6 MONTH) THEN 1 ELSE 0 END) AS MON07
,SUM(CASE WHEN ORD_DATE BETWEEN
DATE(LAST_DAY(CURRENT DATE - 8 MONTH) + 1 DAY) AND
LAST_DAY(CURRENT DATE- 7 MONTH) THEN 1 ELSE 0 END) AS MON08
,SUM(CASE WHEN ORD_DATE BETWEEN
DATE(LAST_DAY(CURRENT DATE - 9 MONTH) + 1 DAY) AND
LAST_DAY(CURRENT DATE- 8 MONTH) THEN 1 ELSE 0 END) AS MON09
,SUM(CASE WHEN ORD_DATE BETWEEN
DATE(LAST_DAY(CURRENT DATE - 10 MONTH) + 1 DAY) AND
LAST_DAY(CURRENT DATE- 9 MONTH) THEN 1 ELSE 0 END) AS MON10
,SUM(CASE WHEN ORD_DATE BETWEEN
DATE(LAST_DAY(CURRENT DATE - 11 MONTH) + 1 DAY) AND
LAST_DAY(CURRENT DATE- 10 MONTH) THEN 1 ELSE 0 END) AS MON11
,SUM(CASE WHEN ORD_DATE BETWEEN
DATE(LAST_DAY(CURRENT DATE - 12 MONTH) + 1 DAY) AND
LAST_DAY(CURRENT DATE- 11 MONTH) THEN 1 ELSE 0 END) AS MON12
FROM TABLE
GROUP BY ID
;
The logic behind this is to generate the date range. Hopefully the following query will give you an idea
Code:
SELECT DATE(LAST_DAY(CURRENT DATE - 1 MONTH) + 1 DAY) AS M01_START_DATE
,LAST_DAY(CURRENT DATE- 0 MONTH) AS M01_END_DATE
,DATE(LAST_DAY(CURRENT DATE - 2 MONTH) + 1 DAY) AS M01_START_DATE
,LAST_DAY(CURRENT DATE- 1 MONTH) AS M02_END_DATE
,DATE(LAST_DAY(CURRENT DATE - 3 MONTH) + 1 DAY) AS M03_START_DATE
,LAST_DAY(CURRENT DATE- 2 MONTH) AS M03_END_DATE
,DATE(LAST_DAY(CURRENT DATE - 4 MONTH) + 1 DAY) AS M04_START_DATE
,LAST_DAY(CURRENT DATE- 3 MONTH) AS M04_END_DATE
,DATE(LAST_DAY(CURRENT DATE - 5 MONTH) + 1 DAY) AS M05_START_DATE
,LAST_DAY(CURRENT DATE- 4 MONTH) AS M05_END_DATE
,DATE(LAST_DAY(CURRENT DATE - 6 MONTH) + 1 DAY) AS M06_START_DATE
,LAST_DAY(CURRENT DATE- 5 MONTH) AS M06_END_DATE
,DATE(LAST_DAY(CURRENT DATE - 7 MONTH) + 1 DAY) AS M07_START_DATE
,LAST_DAY(CURRENT DATE- 6 MONTH) AS M07_END_DATE
,DATE(LAST_DAY(CURRENT DATE - 8 MONTH) + 1 DAY) AS M08_START_DATE
,LAST_DAY(CURRENT DATE- 7 MONTH) AS M08_END_DATE
,DATE(LAST_DAY(CURRENT DATE - 9 MONTH) + 1 DAY) AS M09_START_DATE
,LAST_DAY(CURRENT DATE- 8 MONTH) AS M09_END_DATE
,DATE(LAST_DAY(CURRENT DATE - 10 MONTH) + 1 DAY) AS M10_START_DATE
,LAST_DAY(CURRENT DATE- 9 MONTH) AS M10_END_DATE
,DATE(LAST_DAY(CURRENT DATE - 11 MONTH) + 1 DAY) AS M11_START_DATE
,LAST_DAY(CURRENT DATE- 10 MONTH) AS M11_END_DATE
,DATE(LAST_DAY(CURRENT DATE - 12 MONTH) + 1 DAY) AS M12_START_DATE
,LAST_DAY(CURRENT DATE- 11 MONTH) AS M12_END_DATE
FROM SYSIBM.SYSDUMMY1
;
SELECT C.ADLPPLNCD
,SUM(CASE WHEN MN = :MONTH-1 THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = :MONTH-2 THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = :MONTH-3 THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = :MONTH-4 THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = :MONTH-5 THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = :MONTH-6 THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = :MONTH-7 THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = :MONTH-8 THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = :MONTH-9 THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = :MONTH-10 THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = :MONTH-11 THEN C.CNT ELSE 0 END)
,SUM(CASE WHEN MN = :MONTH-12 THEN C.CNT ELSE 0 END)
FROM (SELECT ADLP_LOC_PLAN_CD AS ADLPPLNCD
, COUNT(ADLP_LOC_PLAN_CD) AS CNT
, YEAR(ADLP_LAST_UPDT) AS YR
, MONTH(ADLP_LAST_UPDT) AS MN
, DATE(ADLP_LAST_UPDT) AS DT
FROM ADLPCRHS
GROUP BY ADLP_LOC_PLAN_CD
, ADLP_LAST_UPDT) C
WHERE DATE(C.DT) BETWEEN
:START-DATE AND :END-DATE
GROUP BY C.ADLPPLNCD
ORDER BY C.ADLPPLNCD
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum