返回多行,其中数据库中的计数在 2 列上超过 1 个匹配项。如果两列在另一行中匹配,则返回两行

Return multiple rows where count in the Database is more than 1 matching on 2 columns. If BOTH columns match in another row, return both rows

提问人:Andy P James 提问时间:8/15/2023 最后编辑:Ankit JindalAndy P James 更新时间:8/17/2023 访问量:37

问:

我正在查询我们的 IT 服务管理系统,并希望带回符合以下条件的工单。

  1. 一定是事件
  2. 必须处于打开状态
  3. 记录它的用户必须打开另一个具有相同问题类型 (probcode) 的票证

这是我遇到问题的 3 个。我可以轻松识别具有 1 个以上未结票证的用户,但无法弄清楚如何同时过滤该票证和概率码。

我尝试使用下面的 SQL 识别符合条件的工单,但它仍然带回了用户拥有多个未结工单的工单,而不管他们的另一张工单是否具有相同的概率码。

(
SELECT Cust_ID
FROM opencall
WHERE callclass="Incident"
  AND Status NOT IN (6,16,17,18)
GROUP BY Cust_id, probcode
HAVING (COUNT(cust_id) > 1
        AND COUNT(probcode) > 1)
)
sql MySQL的 拥有

评论

2赞 jarlh 8/15/2023
在寻求 SQL 帮助时,一个最小的可重现示例是一个很好的开始。
0赞 Barmar 8/15/2023
你不是在选择门票,而是在选择客户。
0赞 Barmar 8/15/2023
HAVING COUNT(*) > 1就足够了,您不需要指定列名称。
0赞 Barmar 8/15/2023
添加到“SELECT”列表以获取具有相同问题代码的该客户的所有工单列表。GROUP_CONCAT(ticket_id)
0赞 Eric 8/16/2023
根据所提供的信息,您认为人们如何帮助您???

答:

0赞 Adrian Maxwell 8/17/2023 #1

你声明你“想带回匹配的票证”,所以要获得所有事件细节,你可能应该避免分组。因此,我认为这是一种适合使用的情况,它可以为拥有多个具有相同问题代码的未结工单的用户返回所有事件。例如:EXISTS

SELECT
       o1.*
FROM opencall o1
WHERE o1.callclass = "Incident"
    AND o1.status NOT IN (6, 16, 17, 18)
    AND EXISTS (
        SELECT 1
        FROM opencall o2
        WHERE o2.Cust_ID = o1.Cust_ID
            AND o2.probcode = o1.probcode
            AND o2.callref <> o1.callref  -- must be more than 1 incident
            AND o2.callclass = "Incident"
            AND o2.status NOT IN (6, 16, 17, 18)
        )

注意,此查询不会标识状态为 null 的行。