<?xml version="1.0" encoding="UTF-8"?>
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
<mapper namespace="com.tcm.training.admin.statistics.mapper.UserStatisticsMapper">
|
|
<sql id="AppUserTypeFilter">
|
<if test="userType != null and userType == 'NORMAL'">
|
AND (${alias}.member_expire_at IS NULL OR ${alias}.member_expire_at <= NOW())
|
</if>
|
<if test="userType != null and userType == 'MEMBER'">
|
AND ${alias}.member_expire_at IS NOT NULL AND ${alias}.member_expire_at > NOW()
|
</if>
|
</sql>
|
|
<select id="selectOverview" resultType="com.tcm.training.admin.statistics.row.UserStatisticsOverviewRow">
|
SELECT
|
COALESCE((
|
SELECT COUNT(1)
|
FROM tcm_app_user u
|
WHERE u.deleted = 0
|
AND u.created_at <![CDATA[>=]]> #{startTime}
|
AND u.created_at <![CDATA[<=]]> #{endTime}
|
<include refid="AppUserTypeFilter">
|
<property name="alias" value="u"/>
|
</include>
|
), 0) AS registeredUserCount,
|
COALESCE((
|
SELECT COUNT(1)
|
FROM tcm_app_user u
|
WHERE u.deleted = 0
|
AND u.type = 1
|
AND u.created_at <![CDATA[>=]]> #{startTime}
|
AND u.created_at <![CDATA[<=]]> #{endTime}
|
<include refid="AppUserTypeFilter">
|
<property name="alias" value="u"/>
|
</include>
|
), 0) AS doctorRegisteredCount,
|
COALESCE((
|
SELECT COUNT(1)
|
FROM tcm_member_purchase_order o
|
INNER JOIN tcm_app_user u ON u.id = o.app_user_id AND u.deleted = 0
|
WHERE o.deleted = 0
|
AND o.status IN ('PAID', 'REFUNDED')
|
AND o.paid_at IS NOT NULL
|
AND o.paid_at <![CDATA[>=]]> #{startTime}
|
AND o.paid_at <![CDATA[<=]]> #{endTime}
|
<include refid="AppUserTypeFilter">
|
<property name="alias" value="u"/>
|
</include>
|
), 0) AS memberOpenCount,
|
COALESCE((
|
SELECT COUNT(1)
|
FROM tcm_course_purchase_order o
|
INNER JOIN tcm_app_user u ON u.id = o.app_user_id AND u.deleted = 0
|
WHERE o.deleted = 0
|
AND o.status IN ('PAID', 'REFUNDED')
|
AND o.paid_at IS NOT NULL
|
AND o.paid_at <![CDATA[>=]]> #{startTime}
|
AND o.paid_at <![CDATA[<=]]> #{endTime}
|
<include refid="AppUserTypeFilter">
|
<property name="alias" value="u"/>
|
</include>
|
), 0) AS coursePurchaseCount,
|
COALESCE((
|
SELECT COUNT(1)
|
FROM tcm_live_watch_record w
|
INNER JOIN tcm_app_user u ON u.id = w.app_user_id AND u.deleted = 0
|
WHERE w.watch_start <![CDATA[>=]]> #{startTime}
|
AND w.watch_start <![CDATA[<=]]> #{endTime}
|
<include refid="AppUserTypeFilter">
|
<property name="alias" value="u"/>
|
</include>
|
), 0) AS liveWatchClickCount,
|
COALESCE((
|
SELECT COUNT(DISTINCT l.app_user_id)
|
FROM tcm_app_user_entry_log l
|
INNER JOIN tcm_app_user u ON u.id = l.app_user_id AND u.deleted = 0
|
WHERE l.deleted = 0
|
AND l.entry_time <![CDATA[>=]]> #{startTime}
|
AND l.entry_time <![CDATA[<=]]> #{endTime}
|
<include refid="AppUserTypeFilter">
|
<property name="alias" value="u"/>
|
</include>
|
), 0) AS activeEnterUserCount,
|
COALESCE((
|
SELECT COUNT(1)
|
FROM tcm_app_user u
|
WHERE u.deleted = 0
|
<include refid="AppUserTypeFilter">
|
<property name="alias" value="u"/>
|
</include>
|
), 0) AS totalUserCount
|
FROM DUAL
|
</select>
|
|
<select id="selectRegisterTrend" resultType="com.tcm.training.admin.statistics.row.UserStatisticsRegisterTrendRow">
|
SELECT
|
DATE(u.created_at) AS statDate,
|
COUNT(1) AS registeredUserCount,
|
COALESCE(SUM(CASE WHEN u.type = 1 THEN 1 ELSE 0 END), 0) AS doctorRegisteredCount
|
FROM tcm_app_user u
|
WHERE u.deleted = 0
|
AND u.created_at <![CDATA[>=]]> #{startTime}
|
AND u.created_at <![CDATA[<=]]> #{endTime}
|
<include refid="AppUserTypeFilter">
|
<property name="alias" value="u"/>
|
</include>
|
GROUP BY DATE(u.created_at)
|
ORDER BY DATE(u.created_at) ASC
|
</select>
|
|
<select id="selectActiveTrend" resultType="com.tcm.training.admin.statistics.row.UserStatisticsActiveTrendRow">
|
SELECT
|
DATE(l.entry_time) AS statDate,
|
COUNT(DISTINCT l.app_user_id) AS activeEnterUserCount
|
FROM tcm_app_user_entry_log l
|
INNER JOIN tcm_app_user u ON u.id = l.app_user_id AND u.deleted = 0
|
WHERE l.deleted = 0
|
AND l.entry_time <![CDATA[>=]]> #{startTime}
|
AND l.entry_time <![CDATA[<=]]> #{endTime}
|
<include refid="AppUserTypeFilter">
|
<property name="alias" value="u"/>
|
</include>
|
GROUP BY DATE(l.entry_time)
|
ORDER BY DATE(l.entry_time) ASC
|
</select>
|
|
<select id="selectMemberComposition" resultType="com.tcm.training.admin.statistics.row.UserStatisticsCompositionRow">
|
SELECT
|
COALESCE((
|
SELECT COUNT(1)
|
FROM tcm_member_purchase_order o
|
INNER JOIN tcm_app_user u ON u.id = o.app_user_id AND u.deleted = 0
|
WHERE o.deleted = 0
|
AND o.status IN ('PAID', 'REFUNDED')
|
AND o.paid_at IS NOT NULL
|
AND o.paid_at <![CDATA[>=]]> #{startTime}
|
AND o.paid_at <![CDATA[<=]]> #{endTime}
|
AND o.member_type = 'MONTH_CARD'
|
<include refid="AppUserTypeFilter">
|
<property name="alias" value="u"/>
|
</include>
|
), 0) AS monthMemberPurchaseCount,
|
COALESCE((
|
SELECT COUNT(1)
|
FROM tcm_member_purchase_order o
|
INNER JOIN tcm_app_user u ON u.id = o.app_user_id AND u.deleted = 0
|
WHERE o.deleted = 0
|
AND o.status IN ('PAID', 'REFUNDED')
|
AND o.paid_at IS NOT NULL
|
AND o.paid_at <![CDATA[>=]]> #{startTime}
|
AND o.paid_at <![CDATA[<=]]> #{endTime}
|
AND o.member_type = 'QUARTER_CARD'
|
<include refid="AppUserTypeFilter">
|
<property name="alias" value="u"/>
|
</include>
|
), 0) AS quarterMemberPurchaseCount,
|
COALESCE((
|
SELECT COUNT(DISTINCT o.app_user_id)
|
FROM tcm_course_purchase_order o
|
INNER JOIN tcm_app_user u ON u.id = o.app_user_id AND u.deleted = 0
|
WHERE o.deleted = 0
|
AND o.status IN ('PAID', 'REFUNDED')
|
AND o.paid_at IS NOT NULL
|
AND o.paid_at <![CDATA[>=]]> #{startTime}
|
AND o.paid_at <![CDATA[<=]]> #{endTime}
|
<include refid="AppUserTypeFilter">
|
<property name="alias" value="u"/>
|
</include>
|
), 0) AS courseMemberUserCount
|
FROM DUAL
|
</select>
|
|
</mapper>
|