You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL按日期统计另一表记录数:现有查询扩展求助

嘿,我太懂这种熬大半天写查询却卡壳的滋味了,简直让人头大!别着急,咱们来一步步解决这个问题——你要做的就是把现有统计和另一张表的每日记录数结合起来对吧?

首先,我先把你的需求拆解一下:你的现有查询是按用户分组、日期、问题ID/内容统计不同评分(NULL/Poor/Good等)的数量,现在要额外加上另一张表按相同日期统计的总记录数。

核心思路是把你的现有查询做成一个独立的统计模块,再和另一张表的每日统计结果通过日期关联起来。这里用CTE(公共表表达式)会让逻辑更清晰,避免嵌套子查询的混乱。

假设你的另一张表叫OtherTable,里面有一个时间字段比如RecordTime(你可以替换成实际字段名),下面是完整的示例代码:

WITH OriginalSurveyStats AS (
    -- 这里是你原有的查询,我帮你补全了基本结构,记得替换实际表名和关联条件
    SELECT 
        B.Usr_Sb_Grp, 
        DATE(CONVERT_TZ(A.TimeStamp,'UTC','America/Chicago')) AS Day, 
        B.ID, 
        B.Qstn, 
        SUM(IF(A.AnswerID = '0', 1, 0)) AS 'NULL', 
        SUM(IF(A.AnswerID = '1', 1, 0)) AS 'Poor', 
        SUM(IF(A.AnswerID = '2', 1, 0)) AS 'Good'
        -- 把你原来没写完的其他AnswerID统计补在这里
    FROM 
        -- 替换成你实际的表A和表B的名字,还有它们的关联条件(比如A的问题ID对应B的ID)
        YourTableA A
        INNER JOIN YourTableB B ON A.Qstn_ID = B.ID
    -- 如果原查询有WHERE过滤条件,加在这里
    -- WHERE A.SomeCondition = 'xxx'
    GROUP BY 
        B.Usr_Sb_Grp, Day, B.ID, B.Qstn
),
OtherTableDailyCounts AS (
    -- 另一张表的每日记录数统计,时区转换要和上面完全一致!
    SELECT 
        DATE(CONVERT_TZ(RecordTime,'UTC','America/Chicago')) AS Day,
        COUNT(*) AS DailyRecordCount
    FROM 
        YourOtherTable
    -- 如果另一表需要过滤条件,加在这里
    -- WHERE RecordStatus = 'Valid'
    GROUP BY 
        Day
)
-- 把两个统计结果关联起来
SELECT 
    oss.*,
    -- 用COALESCE确保如果某天另一表没记录,显示0而不是NULL
    COALESCE(otdc.DailyRecordCount, 0) AS OtherTableDailyRecords
FROM 
    OriginalSurveyStats oss
    -- 用LEFT JOIN保证原统计的所有日期都能显示,哪怕另一表当天没数据
    LEFT JOIN OtherTableDailyCounts otdc ON oss.Day = otdc.Day
ORDER BY 
    oss.Day, oss.Usr_Sb_Grp, oss.ID;

这里有几个关键细节一定要注意:

  • 时区转换必须完全一致:两张表的Day字段都要用CONVERT_TZ转成芝加哥时间的日期,否则会出现日期不匹配的情况(比如一个是UTC日期,一个是芝加哥日期,关联不上)
  • JOIN类型选择:如果希望原查询的所有记录都保留,哪怕另一表当天没有记录,就用LEFT JOIN;如果只需要显示两表都有数据的日期,换成INNER JOIN
  • COALESCE的作用:当另一表某天没有记录时,LEFT JOIN会返回NULL,用COALESCE把它转换成0,统计结果更合理
  • 替换实际名称:记得把代码里的YourTableA、YourTableB、YourOtherTable换成你数据库里的真实表名,还有关联条件(比如A.Qstn_ID = B.ID)也要改成你实际的关联逻辑

如果你的需求是按用户分组+日期统计另一表的记录数(而不是单纯的全局每日数),那只需要修改OtherTableDailyCounts的GROUP BY,加上Usr_Sb_Grp,同时JOIN条件也要匹配这个字段,比如:

OtherTableDailyCounts AS (
    SELECT 
        Usr_Sb_Grp, -- 假设另一表也有这个分组字段
        DATE(CONVERT_TZ(RecordTime,'UTC','America/Chicago')) AS Day,
        COUNT(*) AS DailyRecordCount
    FROM 
        YourOtherTable
    GROUP BY 
        Usr_Sb_Grp, Day
)
-- 然后JOIN条件改成:
LEFT JOIN OtherTableDailyCounts otdc ON oss.Day = otdc.Day AND oss.Usr_Sb_Grp = otdc.Usr_Sb_Grp

这样就能实现每个用户分组每天的记录数统计了。

内容的提问来源于stack exchange,提问作者Emerge2001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:22:09