2014-02-05 3 views
0

내가 텍스트로 다음 연도 + 월별로 그룹에 테이블의 내용을 원하는/O를 기록 승 개월을 얻을 카운트까지 추가 :SQL 그룹,하지만 너무


+-------------+---------+----------+----------+ 
| TEXT  | T1_YEAR | T1_MONTH | T1_COUNT | 
+-------------+---------+----------+----------+ 
| First Text | 2013 |  1 |  1 | 
| First Text | 2013 |  2 |  1 | 
| First Text | 2013 |  3 |  1 | 
| First Text | 2013 |  5 |  1 | 
| First Text | 2013 |  6 |  3 | 
| First Text | 2013 |  7 |  1 | 
| First Text | 2013 |  8 |  3 | 
| First Text | 2013 |  9 |  1 | 
| First Text | 2013 |  10 |  2 | 
| Second Text | 2013 |  1 |  2 | 
| Second Text | 2013 |  2 |  5 | 
| Second Text | 2013 |  3 |  8 | 
| Second Text | 2013 |  4 |  5 | 
| Second Text | 2013 |  5 |  23 | 
| Second Text | 2013 |  6 |  9 | 
| Second Text | 2013 |  7 |  27 | 
+-------------+---------+----------+----------+ 
select 
    table1.TEXT text, 
    year(table1.timestamp) t1_year, 
    month(table1.timestamp) t1_month, 
    count (*) as t1_count 
from table1 
group by 
    table1.TEXT, 
    year(table1.timestamp), 
    month(table1.timestamp) 
with ur; 

이제 카운트가 0 인 누락 월에 대한 결과 테이블에 항목을 넣을 수 있습니다.

임시 테이블에 대한 다른 스레드를 읽었지만 제대로 작동시키는 방법을 찾지 못했습니다.

WITH DATERANGE(LEVEL, TEMP_DATE) AS (
    SELECT 1, CURRENT DATE - 5 MONTHS 
    FROM SYSIBM.SYSDUMMY1 
    UNION ALL SELECT LEVEL + 1, TEMP_DATE + 1 MONTH 
    FROM DATERANGE 
    WHERE LEVEL < 1000 AND TEMP_DATE < CURRENT DATE - 1 MONTH 
) SELECT TEMP_DATE FROM DATERANGE; 

임시 날짜 테이블 :

+------------+ 
| TEMP_DATE | 
+------------+ 
| 2013-09-05 | 
| 2013-10-05 | 
| 2013-11-05 | 
| 2013-12-05 | 
| 2014-01-05 | 
+------------+ 

가 어떻게이 쉬운을 달성 할 수 있습니까? DB2를 사용하고 있습니다.

+0

경우 특정 달에 대한 데이터는 없지만 결과를 count (*) = 0으로 표시하려면 왼쪽 외부 조인을 임시 테이블이나 숫자 1-12의 테이블 변수에 출력해야합니다. 임시 테이블에서 숫자 1 - 12를 가져 와서 결합합니다. 데이터가 누락 된 달 동안 계속 행을 얻을 수 있습니다. 0의 수를 가진 –

+0

OK 나는 감사를 본다. INSERT INTO SESSION.T_MONTHS VALUES (1);로 데이터를 삽입했습니다. 내 임시 테이블에 있지만 내 임시 테이블에서 선택 * SESSION.T_MONTHS에서 * 선택; 빈 결과 집합을 반환합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? – user3193317

+0

이 문제에 대해 OLAP 기능을 사용할 수 있습니다. 그러나 나는 지금 예를 쓸 수 없다. – AngocA

답변

0

같은 종류의 값 (년 및 월)으로 임시 테이블을 만들 것입니다. 그럼 당신은 외부가 데이터 표에 그에서 가입 할 수 있습니다 : (그들이 DB2를 가지고 있지 않기 때문에, SQL 서버, 그러나 잘 번역한다)

여기
select 
dt.theyear, 
dt.themonth, 
sum(t1_count) 

from 
DateTable DT 
left outer join table1 t1 
    on dt.theyear = t1.t1_year 
    and dt.theMOnth = t1.t1_month 
group by 
dt.theyear, 
dt.themonth 

는 SQL 바이올린의 예입니다 : SQL FIddle