欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

db2sql语句有关问题

更新时间: 2014-01-05 02:22:55 责任编辑: Author_N1

 

db2sql语句问题
表1
编号    金额1    金额2      件数          日期  
001      100      400        1          2012-1-1
001               600                   2012-1-1
002      300      300        2          2012-1-1
003      300      300        2          2012-1-2
002      300      300        2          2012-1-2
003      300      300        2          2012-1-2

……
想要统计如下成样式,应该怎么写sql啊?
注:日期统计不跨月,按月按日期区间筛选。
编号       1号(按日期统计记录数据)  2号  3号  ……  31号
001        2                           0    0   ……  31号
002        1                           1    0   ……  31号
003        0                           2    0   ……  31号

--参考方法--
select id,
       sum(case when date='2012-01-01' then num end),
       sum(case when date='2012-01-02' then num end),
       ......//依次类推
from (
     select id,date,count(*) as num
     from t1
     group by id,date
)
group by id

--参考方法--
用存储过程,或者拼SQL。
--参考方法--
参考一下: 
CREATE PROCEDURE DB2ADMIN.GET_COUNT_MONTH(IN YM VARCHAR(7),IN DAYS INTEGER,OUT osql VARCHAR(11000)) 
RESULT SETS 2 
LANGUAGE SQL 
P: BEGIN 
DECLARE mycount INTEGER;
DECLARE countvar VARCHAR(2);
DECLARE mysql VARCHAR(11000);
DECLARE headsql VARCHAR(100);
DECLARE subsql VARCHAR(10000);
DECLARE tailsql VARCHAR(300);
DECLARE stmt STATEMENT;
DECLARE mcur CURSOR WITH HOLD WITH RETURN TO CALLER FOR stmt; 
SET mycount = 1;
SET headsql = 'SELECT TEMP.NUM,';
SET subsql= CONCAT('SUM(CASE WHEN TEMP.DATE=''',CONCAT(CONCAT(YM,'-01'),''' THEN TEMP.COUNTS ELSE 0 END) AS D01'));
WHILE mycount < DAYS DO 
SET mycount = mycount + 1;
IF mycount < 10 THEN 
SET countvar = CONCAT('0',RTRIM(CHAR(mycount)));
END IF;
IF mycount >= 10 THEN 
SET countvar = RTRIM(CHAR(mycount));
END IF;
SET subsql = CONCAT(subsql,CONCAT(',',CONCAT('SUM(CASE WHEN TEMP.DATE=''',CONCAT(CONCAT(YM,CONCAT('-',countvar)),CONCAT(''' THEN TEMP.COUNTS ELSE 0 END) AS D',countvar)))));
END WHILE; 
SET tailsql = ' FROM (SELECT NUM,DATE,COUNT(*) AS COUNTS FROM DB2ADMIN.MOTHAMOUNT GROUP BY NUM,DATE) TEMP GROUP BY TEMP.NUM '; 
SET mysql = CONCAT(CONCAT(headsql,subsql),tailsql); 
SET osql = mysql;
PREPARE stmt FROM mysql;
OPEN mcur; 
END P 

适当的修改一下表名,列名等内容应该可实现,还有去掉输出参数(osql:最后拼出的sql语句),传入的两个参数是年月YM(String:yyyy-MM),每月天数DAYS(int)。
调用:
CALL DB2ADMIN.GET_COUNT_MONTH('2012-01',31,?);
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:22:55
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/9105/
本文WWW.DOC100.NET DOC100.NET版权所有。