sql中按不同字段统计数量的查询语句,要求在一个时间段中

如有一张表记录了病人的入院日期、出院日期,现在分别按照入院日期和出院日期统计某个时间段的入院病人和出院病人人数。比如2013-10-12入院3人,2013-11-10入院... 如有一张表记录了病人的 入院日期 、出院日期,现在分别按照入院日期和出院日期统计某个时间段的入院病人和出院病人人数。比如 2013-10-12入院3人, 2013-11-10入院2人, 2013-11-12入院1人 出院1人,表如下
病人ID 入院日期 出院日期
1 2013-10-12
2 2013-10-12
3 2013-10-12 2013-11-12
4 2013-11-10
5 2013-11-10
6 2013-11-12

则选时间段2013-10-11至2013-11-13:显示的结果为
时间 入院人数 出院人数
2013-10-12 3 0
2013-11-10 2 0
2013-11-12 1 1

请各位高手帮忙一下,谢谢!
展开
 我来答
念天地之悠悠O
2018-12-24
知道答主
回答量:1
采纳率:0%
帮助的人:782
展开全部
// thinkphp5.1  查询7天内每天的金额总数
$dates = [];
        for ($i=7; $i >= 0; $i--) { // 近7天日期
            $dates[] = date('Y-m-d', strtotime('-'.$i.' days'));
        }
        $where  = " where unix_timestamp(time) >= unix_timestamp('".$dates[0]."')";
        $order     = " group by date_format(time, '%Y-%m-%d')";
        $select    = "select date_format(time, '%Y-%m-%d') as time,sum(money) as count from czjl";
        $sql       = $select.$where.$order;
        $orderList = Db::query($sql); 
        dump($orderList);

数据库

结果

你可以参考下

hnhygkx1987
推荐于2017-09-22 · TA获得超过209个赞
知道小有建树答主
回答量:210
采纳率:0%
帮助的人:136万
展开全部

楼主如下写即可,望采纳:

SELECT A.日期,ISNULL(B.入院人数,0) AS 入院人数,ISNULL(C.出院人数,0) AS 出院人数
FROM
(
    SELECT 入院日期 AS 日期 FROM TABLE GROUP BY 入院日期
    WHERE 入院日期 >= '2013-10-11' AND 出院日期 <= '2013-11-13'
    
    UNION 
    SELECT 出院日期  AS 日期 FROM TABLE GROUP BY 出院日期
    WHERE 入院日期 >= '2013-10-11' AND 出院日期 <= '2013-11-13'
)A 
LEFT JOIN
(
  SELECT COUNT(ID) AS 入院人数,入院日期 FROM TABLE GROUP BY 入院日期
)B ON B.入院日期=A.日期
LEFT JOIN 
(
 SELECT COUNT(ID) AS 出院人数,出院日期 FROM TABLE GROUP BY 出院日期
)C ON C.出院日期 = A.日期
更多追问追答
追问

它第一个where那里提示 缺失右括号。。。

追答

不好意思,写错了,你照下面的写法,group by 应该是在where 后面:

SELECT A.日期,ISNULL(B.入院人数,0) AS 入院人数,ISNULL(C.出院人数,0) AS 出院人数 

FROM 



    SELECT 入院日期 AS 日期 FROM TABLE

    WHERE 入院日期 >= '2013-10-11' AND 出院日期 <= '2013-11-13' 

     GROUP BY 入院日期   

    UNION  

    SELECT 出院日期  AS 日期 FROM TABLE 

    WHERE 入院日期 >= '2013-10-11' AND 出院日期 <= '2013-11-13' 

    GROUP BY 出院日期 

)A  

LEFT JOIN 



  SELECT COUNT(ID) AS 入院人数,入院日期 FROM TABLE GROUP BY 入院日期 

)B ON B.入院日期=A.日期 

LEFT JOIN  



 SELECT COUNT(ID) AS 出院人数,出院日期 FROM TABLE GROUP BY 出院日期 

)C ON C.出院日期 = A.日期
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
常尔02U
2013-11-19 · TA获得超过132个赞
知道小有建树答主
回答量:220
采纳率:0%
帮助的人:225万
展开全部
select
case when a.入院日期 is null then b.出院日期 else a.入院日期 end as 时间,
case when a.入院人数 is null then 0 else a.入院人数 end as 入院人数,
case when b.出院人数 is null then 0 else b.出院人数 end as 出院人数
from
(select 入院日期,count(1) as 入院人数
from tab
group by 入院日期
) a full join
(select 出院日期,count(1) as 出院人数
from tab
where 出院日期 is not null
group by 出院日期
) b on a.入院日期=b.出院日期
追问
谢谢你的帮助~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
孛飞子车怡嘉
2020-05-24 · TA获得超过3736个赞
知道大有可为答主
回答量:3208
采纳率:28%
帮助的人:165万
展开全部
楼主如下写即可,望采纳:
123456789101112131415161718SELECT A.日期,ISNULL(B.入院人数,0) AS 入院人数,ISNULL(C.出院人数,0) AS 出院人数FROM( SELECT 入院日期 AS 日期 FROM TABLE GROUP BY 入院日期 WHERE 入院日期 >= '2013-10-11' AND 出院日期 <= '2013-11-13' UNION SELECT 出院日期 AS 日期 FROM TABLE GROUP BY 出院日期 WHERE 入院日期 >= '2013-10-11' AND 出院日期 <= '2013-11-13')A LEFT JOIN( SELECT COUNT(ID) AS 入院人数,入院日期 FROM TABLE GROUP BY 入院日期)B ON B.入院日期=A.日期LEFT JOIN ( SELECT COUNT(ID) AS 出院人数,出院日期 FROM TABLE GROUP BY 出院日期)C ON C.出院日期 = A.日期
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lzh3452
2013-11-19 · TA获得超过1044个赞
知道小有建树答主
回答量:1168
采纳率:100%
帮助的人:851万
展开全部
SELECT NVL(T1."DATE", T2."DATE") "时间", NVL(T1.CNT1, 0) "入院人数", NVL(T2.CNT2, 0) "出院人数"
  FROM (SELECT T."入院日期" "DATE", COUNT(*) CNT1
          FROM "TEST" T
         WHERE T."入院日期" BETWEEN TO_DATE('20131011') AND TO_DATE('20131113')
         GROUP BY T."入院日期") T1
  FULL JOIN (SELECT T."出院日期" "DATE", COUNT(*) CNT2
               FROM "TEST" T
              WHERE T."出院日期" BETWEEN TO_DATE('20131011') AND
                    TO_DATE('20131113')
              GROUP BY T."出院日期") T2
    ON T1."DATE" = T2."DATE"
ORDER BY NVL(T1."DATE", T2."DATE")

我这不是中文系统,SQL里的中文是后贴上去的,原来都是英文,保证好用

追问
谢谢你的帮助~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式