现在有一个需求比如有一张用户注册表其中有id,name,sex,regist_date,然后我要统计每一天男女各注册了多少人,展示在页面的效果大致是:
日期 男 女
2017-8-17 50 68
2017-8-16 0 21
2017-8-15 0 0
然后我就想问一下有没有一个好的sql查询可以查出这样的数据展示格式并且还能实现分页效果。
SEX REGIST_DATE COUNTS
男 2017-08-18 5
女 2017-08-18 8
这样吗?
SELECT CASE
WHEN sex = '1' THEN
'男'
ELSE
'女'
END sex
,to_char(s.regist_date, 'yyyy-MM-dd') regist_date
,COUNT(id) counts
FROM users s
GROUP BY to_char(s.regist_date, 'yyyy-MM-dd'), sex
不是这样的,要一次查出指定日期时间段内每天(ps:每一个日期都要有)男有多少人,女有多少人,如果其中有一天没有数据则展示数据为0
SEX MONTHDAYS COUNT(ID)
男 2017/8/1 0
女 2017/8/1 0
女 2017/8/2 0
男 2017/8/2 0
男 2017/8/3 0
女 2017/8/3 0
男 2017/8/4 0
女 2017/8/4 0
男 2017/8/5 0
女 2017/8/5 0
男 2017/8/6 0
女 2017/8/6 0
男 2017/8/7 0
女 2017/8/7 0
男 2017/8/8 0
女 2017/8/8 0
女 2017/8/9 0
男 2017/8/9 0
男 2017/8/10 0
女 2017/8/10 0
男 2017/8/11 0
女 2017/8/11 0
男 2017/8/12 0
女 2017/8/12 0
男 2017/8/13 0
女 2017/8/13 0
男 2017/8/14 0
女 2017/8/14 0
女 2017/8/15 0
男 2017/8/15 0
男 2017/8/16 0
女 2017/8/16 0
女 2017/8/17 0
男 2017/8/17 0
女 2017/8/18 8
男 2017/8/18 5
女 2017/8/19 0
男 2017/8/19 0
女 2017/8/20 0
男 2017/8/20 0
女 2017/8/21 0
男 2017/8/21 0
男 2017/8/22 0
女 2017/8/22 0
女 2017/8/23 0
男 2017/8/23 0
女 2017/8/24 0
男 2017/8/24 0
女 2017/8/25 0
男 2017/8/25 0
男 2017/8/26 0
女 2017/8/26 0
女 2017/8/27 0
男 2017/8/27 0
男 2017/8/28 0
女 2017/8/28 0
男 2017/8/29 0
女 2017/8/29 0
女 2017/8/30 0
男 2017/8/30 0
男 2017/8/31 0
女 2017/8/31 0
这样?
WITH base AS
(SELECT *
FROM (SELECT 0 sex FROM dual UNION ALL SELECT 1 FROM dual) s
JOIN (SELECT to_char(SYSDATE, 'yyyy-MM') || '-' || rownum AS monthDays
FROM dual
CONNECT BY LEVEL <= to_number(to_char(last_day(SYSDATE), 'dd'))) md
ON 1 = 1),
allDatas AS
(SELECT to_date(monthDays, 'yyyy-MM-dd') monthDays, base.sex, id
FROM base
LEFT JOIN users s
ON base.monthDays = to_char(s.regist_date, 'yyyy-MM-dd')
AND base.sex = s.sex),
datas AS
(SELECT CASE
WHEN sex = '1' THEN
'男'
ELSE
'女'
END sex
,alldatas.monthDays
,COUNT(id)
FROM allDatas
GROUP BY monthDays, sex)
SELECT * FROM datas ORDER BY monthDays