Oracle 11g技术问询:按USERID统计指定日期内PRODUCT去重扫描数及状态计数
解决方案
以下SQL可实现需求(注意根据数据库类型调整日期转换逻辑):
SELECT USERID, COUNT(DISTINCT PRODUCT) AS `PRODUCT SCAN`, SUM(CASE WHEN STATUS = 1 THEN 1 ELSE 0 END) AS `STATUS1 CNT`, SUM(CASE WHEN STATUS = 2 THEN 1 ELSE 0 END) AS `STATUS2 CNT` FROM your_table_name -- 替换为你的实际表名 WHERE -- 若Date是日期类型,直接用范围匹配 Date BETWEEN '2023-01-01' AND '2023-03-01' -- 若Date是dd-mm-yyyy格式的字符串,MySQL中需转换: -- STR_TO_DATE(Date, '%d-%m-%Y') BETWEEN '2023-01-01' AND '2023-03-01' -- SQL Server中: -- CONVERT(DATE, Date, 105) BETWEEN '2023-01-01' AND '2023-03-01' GROUP BY USERID ORDER BY USERID;
逻辑说明
- 日期筛选:通过
WHERE子句锁定目标时间范围,若Date是字符串类型,必须先转换为日期格式,避免因字符串排序规则导致的筛选错误。 - 分组聚合:按
USERID分组后:COUNT(DISTINCT PRODUCT):自动去重统计用户扫描过的不同产品数量;SUM(CASE...):用条件判断分别统计两种状态的记录数,不满足条件的记录计0,求和后得到对应状态的总次数。
- 排序:按
USERID排序,让结果与期望输出格式一致。
内容的提问来源于stack exchange,提问作者Pearl
相关产品推荐
相关产品推荐

