group by 分组函数 的用法
GROUP BY 是对结果集 进行分组 然后对每一组 ,可以对每一组进行统计 例如对每一组的某个字段进行统计 例如求和sum(column)
举个例子,我查询某个用户的某个时间段 的信息
1.没用到group by 分组的时候, 我查询出多条记录,虽然cons_no 相同,也把表中全部的记录全部显示出来
SELECT AMT_YM,CALC_ID,SETTLE_APQ,CONS_NO
FROM PUB_E_PQ_AMT
WHERE CONS_NO = '1185468207'
AND (AMT_YM BETWEEN '201301' AND '201307')
AMT_YM SETTLE_APQ CONS_NO
------ ----------------- ----------------
201304 50 1185468207
201304 450 1185468207
2.当用到group by 分组 我按cons_no 进行分组 ,相同的 cons_no 被分成一组,然后对每一组的记录 进行统计,
我想求每组记录的 SETTLE_APQ 的和 ,就可以用 sum(SETTLE_APQ) 求和,然后 每几组,就只显示一条记录
SELECT AMT_YM,sum(SETTLE_APQ),CONS_NO
FROM PUB_E_PQ_AMT
WHERE CONS_NO = '1185468207'
AND (AMT_YM BETWEEN '201301' AND '201307')
GROUP BY AMT_YM,cons_no;
显示的结果集
AMT_YM SUM(SETTLE_APQ) CONS_NO
--------------------- -------------------------
201304 500 1185468207
有什么不明白直接说,留言评论
----------------------------------------------------------------
SELECT AMT_YM, /*电费年月 */
PQ,/*应收电量 */
CAT_KWH_AMT,/*目录电度电费 */
T_PL_AMT,/*代征电费*/
PF_ADJ_AMT,/*力率奖惩电费 */
BA,/*基本电费 */
T_AMT,/*总电费*/
CALC_ID,
(select a.user_name
from wf_activity_end f, wf_process_end p, wf_assignment_end a
where p.app_no = TEMP.APP_NO
and f.process_id = p.process_id
and f.definition_id = '03005_100'
and a.activity_id = f.activity_id
and a.process_id = f.process_id
and rownum <= 1
UNION ALL
select a.user_name
from wf_activity_end f, wf_process_end p, wf_assignment_end a
where p.app_no = TEMP.APP_NO
and f.process_id = p.process_id
and f.definition_id = '04007_070'
and a.activity_id = f.activity_id
and a.process_id = f.process_id
and rownum <= 1) PUB_USER_NAME, /*发行人*/
TO_CHAR(SEND_DATE, 'YYYY-MM-DD hh24:mi:ss') SEND_DATE /*发行时间*/
FROM (SELECT AMT_YM,
CALC_ID,
MAX(SEND_DATE) SEND_DATE,
SUM(SETTLE_APQ) PQ, /*应收电量 */
SUM(CAT_KWH_AMT + PL_AMT_10) CAT_KWH_AMT,/*目录电度电费 */
SUM(PL_AMT_01 + PL_AMT_02 + PL_AMT_03 + PL_AMT_04 + PL_AMT_05 +
PL_AMT_06 + PL_AMT_07 + PL_AMT_08 + PL_AMT_09 + PL_AMT_11 +
PL_AMT_12) T_PL_AMT,/*代征电费*/
SUM(PF_ADJ_AMT) PF_ADJ_AMT,/*力率奖惩电费 */
SUM(CAP_BA + DMD_BA) BA,/*基本电费 */
SUM(T_AMT) T_AMT,/*总电费*/
MAX(APP_NO) APP_NO
FROM PUB_E_PQ_AMT
WHERE CONS_NO = '1117190102'
AND (AMT_YM BETWEEN '201301' AND '201307')
/* AND SEND_DATE IS NOT NULL */
GROUP BY AMT_YM, CALC_ID) TEMP
ORDER BY TEMP.AMT_YM DESC, CALC_ID DESC
sql解释: 我已知用户编号 和 电费年月 然后查询这个 PUB_E_PQ_AMT 表,然后把这个表中 电费年月和CALC_id值相同的记录,分成一组,
对每一组的某个字段进行求和 等等