Sql 如何使用内部联接进行分组

Sql 如何使用内部联接进行分组,sql,sql-server,Sql,Sql Server,我在分组方式和内部联接方面有一个小问题。我试着按用户列出事件组中花费的时间,看看哪个用户更高效 在这一刻,我只得到了错误 '列'XXX'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中' 我知道SELECT语句中的所有字段在GROUPBY中都是必需的,但如果我为所有这些字段分组,我就不会收到我想要的 我想我的问题是因为我没有正确理解GroupBy和InternalJoin,所以我尝试学习了很多网站,但至少在这一刻我看不到我的错误 这是我的密码: 选择 id\u事件\u项目作为id

我在分组方式和内部联接方面有一个小问题。我试着按用户列出事件组中花费的时间,看看哪个用户更高效

在这一刻,我只得到了错误

'列'XXX'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中'

我知道SELECT语句中的所有字段在GROUPBY中都是必需的,但如果我为所有这些字段分组,我就不会收到我想要的

我想我的问题是因为我没有正确理解GroupBy和InternalJoin,所以我尝试学习了很多网站,但至少在这一刻我看不到我的错误

这是我的密码:

选择 id\u事件\u项目作为id, i、 标题作为标题, 公司名称作为社会名称, 用户名作为技术单位名称, ia.DESCRIPTION_文本作为说明, CONVERTvarchar,ia.ACTIONDATE,101作为action_日期, CASTTIME与acting_time一样INT, 强制措施时间等于总时间的整数 从…起 事件一 内部联接事件\u 0001 i1上的i1.ID\u事件=i.ID\u事件 内部连接事件\ ia.ID\U事件上的ia操作=i.ID\U事件 a.ID\u agent=ia.ID\u agent上的内部联接代理a 内部连接用户名u on u.ID\u username=a.ID\u username 哪里 ia.ACTIONDATE介于“开始日期YYYYMMDD”和“结束日期YYYYMMDD”之间 按用户名分组 SELECT子句中所有不按其分组的列都必须经过聚合函数。要想得到一些东西,您可以将它们传递给MAX:

但是,当完成所有连接后,同一用户名有多行时,这种方法将冒输出不同源行的值的风险。例如,如果用户名“JohnSmith”说有两起事件,一起发生在2019-01-01,标题为“僵尸目击”,另一起发生在2019-03-31,标题为“Aitch Droping”,那么退出的“最大”标题将是“僵尸目击”,退出的“最大”日期为2019-03-31,因此针对不同的事件

为了避免这种情况,您可以使用基于用户名的分区替换组,对事件进行排序,并以一致的方式为每个用户名选择一个事件:

SELECT
    ID, title, social_name, tech_name, description,
    action_date, acting_time, total_time
FROM (
    SELECT
        id_incident_project) AS ID,
        i.title AS title,
        companyname as social_name,
        username as tech_name,
        ia.DESCRIPTION_TEXT) as description,
        CONVERT(varchar, ia.ACTIONDATE, 101) as action_date,
        CAST(TIME as INT) as acting_time,
        CAST(actions_time as INT) AS total_time,
        ROW_NUMBER () OVER (
            PARTITION BY username
            ORDER BY
                ia.ACTIONDATE DESC,   -- pick out latest
                i1.ID_INCIDENT DESC   -- tie breaker
        ) AS OrderNum
    FROM
        incident i
        INNER JOIN incident_0001 i1 ON i1.ID_INCIDENT = i.ID_INCIDENT
        INNER JOIN incident_action ia ON ia.ID_INCIDENT = i.ID_INCIDENT
        INNER JOIN agent a ON a.ID_AGENT = ia.ID_AGENT
        INNER JOIN username u on u.ID_USERNAME = a.ID_USERNAME
    WHERE
        ia.ACTIONDATE BETWEEN '## START DATE (YYYYMMDD)##' AND '## END DATE (YYYYMMDD)##'
) t
WHERE t.OrderNum = 1

请提供样本数据和预期结果。然后我们可以帮助。帮助我们帮助您-请共享您的表结构、一些示例数据以及您试图获得的结果。您忽略了指定您想要的内容。这会很有帮助。在初始查询中不使用group by。。你能用cte as select试试吗。。根据此结果从cte->中选择*。。你们选择分组方式,有语法。这很难,因为我并没有任何表的结构。我只能根据另一个查询进行查询。这是为“非常安全”的客户准备的。
SELECT
    ID, title, social_name, tech_name, description,
    action_date, acting_time, total_time
FROM (
    SELECT
        id_incident_project) AS ID,
        i.title AS title,
        companyname as social_name,
        username as tech_name,
        ia.DESCRIPTION_TEXT) as description,
        CONVERT(varchar, ia.ACTIONDATE, 101) as action_date,
        CAST(TIME as INT) as acting_time,
        CAST(actions_time as INT) AS total_time,
        ROW_NUMBER () OVER (
            PARTITION BY username
            ORDER BY
                ia.ACTIONDATE DESC,   -- pick out latest
                i1.ID_INCIDENT DESC   -- tie breaker
        ) AS OrderNum
    FROM
        incident i
        INNER JOIN incident_0001 i1 ON i1.ID_INCIDENT = i.ID_INCIDENT
        INNER JOIN incident_action ia ON ia.ID_INCIDENT = i.ID_INCIDENT
        INNER JOIN agent a ON a.ID_AGENT = ia.ID_AGENT
        INNER JOIN username u on u.ID_USERNAME = a.ID_USERNAME
    WHERE
        ia.ACTIONDATE BETWEEN '## START DATE (YYYYMMDD)##' AND '## END DATE (YYYYMMDD)##'
) t
WHERE t.OrderNum = 1