按年+月划分的SQL组,但也可以获取不带记录的月份
我想将表格内容按文本分组,然后按年份+月份分组,并将计数相加:按年+月划分的SQL组,但也可以获取不带记录的月份,sql,db2,Sql,Db2,我想将表格内容按文本分组,然后按年份+月份分组,并将计数相加: +-------------+---------+----------+----------+ | TEXT | T1_YEAR | T1_MONTH | T1_COUNT | +-------------+---------+----------+----------+ | First Text | 2013 | 1 | 1 | | First Text | 2013 |
+-------------+---------+----------+----------+
| 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 |
+-------------+---------+----------+----------+
现在,我还希望在结果表中为缺少的月份创建一个计数为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;
我怎样才能做到这一点?我正在使用DB2。我将创建一个具有相同值的临时表。然后,您可以将其外部联接到数据表:
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 Fiddle示例SQL Server,因为他们没有DB2,但它的翻译应该很好:
如果没有特定月份的数据,但希望在结果中显示为count*=0,则需要将外部联接结果保留到临时表或数字为1-12的表变量,这样,如果从临时表中提取数字1-12并将其联接,对于缺少数据的月份,仍将获得一行。数到0我明白了,谢谢。我使用“INSERT INTO SESSION.T_MONTHS VALUES 1;”插入了数据在我的临时表中,但在我的临时表上选择从SESSION.T_MONTHS中选择*;返回一个空的结果集。我做错了什么?您可以使用OLAP函数解决此问题。但我现在无法编写一个示例。添加提交保留行是在临时表中保留行的解决方案。
+------------+
| TEMP_DATE |
+------------+
| 2013-09-05 |
| 2013-10-05 |
| 2013-11-05 |
| 2013-12-05 |
| 2014-01-05 |
+------------+
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