CASE函数的使用

在查询数据的时候 需要查询含有某种条件的数量,用一个count可能解决不了。那么就要试用一下Sum配合case函数了。

eg:SUM( CASE  WHEN   n.state=0   THEN 1    ELSE 0   END  ) AS normalcount

查询符合state=0的数据总量

也可在内部查询: SUM(   CASE  WHEN

(SELECT   TYPE FROM  t_dev_alarm_state  WHERE id = t1.`alarmstateid`) = 2

              THEN 1      ELSE 0    END     ) AS failurecount,


SELECT *  ,r.realname as mname,r.telephone as mtelephone ,COUNT(p.deviceid) AS Dnum, 
	 SUM( CASE  WHEN   n.state=0   THEN 1    ELSE 0   END  ) AS normalcount,
     SUM( CASE  WHEN   n.state=1   THEN 1    ELSE 0   END  ) AS alarmcount,
     SUM( CASE  WHEN   n.state=2   THEN 1    ELSE 0   END  ) AS failurecount,
     SUM( CASE  WHEN   n.state=3   THEN 1    ELSE 0   END  ) AS othercount
FROM    t_device_group  g
     LEFT JOIN  t_user_dgroup_relation  u ON  u.devicegroupid=g.id
     LEFT JOIN  t_user  r ON  g.managerid=r.id  
     LEFT JOIN  t_device_group_relation  p ON   p.groupid=u.devicegroupid and p.moduleid=#{moduleid}
     LEFT JOIN   
     		<if test="moduleid == 1">t_device_dc</if>
			<if test="moduleid == 2">t_device_yg</if>
			<if test="moduleid == 3">t_device_jg</if>
			<if test="moduleid == 8">t_device_hw</if>
			<if test="moduleid == 9">t_device_ljt</if>
			<if test="moduleid == 10">t_device_sj</if>
			<if test="moduleid == 11">t_device_mc</if>
			<if test="moduleid == 12">t_device_krq</if>
			<if test="moduleid == 13">t_device_ywj</if>  
			 n  ON   n.id=p.deviceid 
     WHERE  u.userid=#{userid} AND g.moduleid=#{moduleid}  and  g.isdelete = 0 and g.isenable = 1 and n.isdelete=0  
     
        <if test="code != null and code != ''">
		AND (g.groupcode LIKE CONCAT('%', #{code}, '%')
		or
		g.groupname LIKE CONCAT('%', #{code}, '%'))
		</if>
              GROUP BY g.id

猜你喜欢

转载自blog.csdn.net/qq_33355858/article/details/80613998