【问题标题】:SQL Server : select the sum of the results of a subquery, ConnectWise DatabaseSQL Server:选择子查询结果的总和,ConnectWise 数据库
【发布时间】:2016-09-28 21:03:39
【问题描述】:

我正在运行一个查询,以查找某些团队在过去一个月中输入的 ConnectWise 时间条目。我想做的是修改下面的查询,使每张票只包含一个结果,但前提是 datediff(s, time_start, time_end) 结果超过 1800。我尝试过的所有内容都出错了,所以我唯一的 MWE 是下面的查询:

SELECT
    service.SR_Service_RecID AS "Ticket #",
    te.Date_Start AS "Time Entry Day",
    m.first_name AS First,
    m.last_name AS Last,
    DATEDIFF(s, te.time_start, te.time_end) AS "Time (s)"
FROM 
    dbo.Time_Entry te
LEFT JOIN  
    dbo.Activity_Class activity ON activity.Activity_Class_RecID = te.Activity_Class_RecID
LEFT JOIN 
    dbo.SR_Service service ON te.SR_Service_RecID = service.SR_Service_RecID
LEFT JOIN 
    dbo.Member m ON m.Member_RecID = te.Member_RecID
LEFT JOIN 
    dbo.SR_Team_Mbr member ON member.Member_RecID = M.Member_RecID
LEFT JOIN 
    dbo.SR_Team T ON T.SR_Team_RecID = member.SR_Team_RecID
WHERE 
    m.member_recID IN (SELECT M.Member_RecID
                       FROM Member M
                       LEFT JOIN dbo.SR_Team_Mbr member ON member.Member_RecID = M.Member_RecID
                       LEFT JOIN dbo.SR_Team T ON T.SR_Team_RecID = member.SR_Team_RecID
                       WHERE T.Description LIKE '%c'
                          OR T.Description LIKE '%d'
                          OR T.Description LIKE '%e')
    AND activity.Description LIKE 'T%'
    AND service.Date_Entered >= DATEADD(MONTH, -1, GETDATE())
GROUP BY 
    service.SR_Service_RecID, te.Time_RecID, te.Date_Start,
    m.first_name, m.last_name,
    DATEDIFF(s, te.time_start, te.time_end)
ORDER BY 
    service.SR_Service_RecID DESC

产生:

Ticket #   Time Entry Day            First   Last    Time(s)
756065     2016-09-28 00:00:00.000   Mr.     Smith   1,000
756065     2016-09-28 00:00:00.000   Mr.     Smith   560

我正在寻找:

Ticket #   Time Entry Day            First   Last    Time(s)
756065     2016-09-28 00:00:00.000   Mr.     Smith   1,560

我已经尝试将其作为子查询的一部分,我认为我的问题是我无法理解我需要做什么才能获得所需结果的逻辑。

非常感谢任何帮助。

【问题讨论】:

  • 只需从您的group by 中删除此datediff(s, te.time_start, te.time_end) 并在您的select 中为该列添加sum

标签: sql-server sum


【解决方案1】:

您的查询中有两处不正确:

  1. SELECT 语句中没有聚合函数。
  2. 您的group by 中有Time (s) 列,导致额外的行

因此,将您的查询更改如下,以纠正这两个问题:

SELECT
    service.SR_Service_RecID AS "Ticket #",
    te.Date_Start AS "Time Entry Day",
    m.first_name AS First,
    m.last_name AS Last,
    SUM(DATEDIFF(s, te.time_start, te.time_end)) AS "Time (s)"
FROM 
    dbo.Time_Entry te
LEFT JOIN  
    dbo.Activity_Class activity ON activity.Activity_Class_RecID = te.Activity_Class_RecID
LEFT JOIN 
    dbo.SR_Service service ON te.SR_Service_RecID = service.SR_Service_RecID
LEFT JOIN 
    dbo.Member m ON m.Member_RecID = te.Member_RecID
LEFT JOIN 
    dbo.SR_Team_Mbr member ON member.Member_RecID = M.Member_RecID
LEFT JOIN 
    dbo.SR_Team T ON T.SR_Team_RecID = member.SR_Team_RecID
WHERE 
    m.member_recID IN (SELECT M.Member_RecID
                       FROM Member M
                       LEFT JOIN dbo.SR_Team_Mbr member ON member.Member_RecID = M.Member_RecID
                       LEFT JOIN dbo.SR_Team T ON T.SR_Team_RecID = member.SR_Team_RecID
                       WHERE T.Description LIKE '%c'
                          OR T.Description LIKE '%d'
                          OR T.Description LIKE '%e')
    AND activity.Description LIKE 'T%'
    AND service.Date_Entered >= DATEADD(MONTH, -1, GETDATE())
GROUP BY 
    service.SR_Service_RecID, te.Date_Start,
    m.first_name, m.last_name
ORDER BY 
    service.SR_Service_RecID DESC

这个MSDN article 应该让您全面了解GROUP BY

【讨论】:

  • 这给了我非常奇怪的结果;每张票我仍然得到多行,并且 Time(s) 列没有正确加起来
  • 您可能在group by 中有其他列可能不需要。尝试从您的group by 中删除te.Time_RecID。假设您不需要该列,我已经更新了我的答案。
  • 谢谢。这涉及每张票的多行,但数学比以前更差。即使只有一次入场的门票也被关闭
  • 您可能需要发布一些输入数据,您现在得到什么以及您期望什么!!我今天请假。希望有人可以解决您的进一步问题。请查看this,了解如何在这里发布好问题。
【解决方案2】:

问题在于您对 SR_Team 和 SR_Team_Member 表的联接。一个成员可以在多个团队中。您似乎正在尝试检查该成员是否在一组特定的团队中。

您提到您希望每张票有一行,但成员可以在相同的时间内在每张票上有多个时间条目。所以在某些情况下,每张票您会得到多行。

如果您希望所有成员的总和超过 1800 秒,则需要对 DATEDIFF() 求和,使用 GROUP BY,从 WHERE 子句中删除 DATEDIFF() > 1800 并在 GROUP BY 之后添加 HAVING 子句。

此查询将为您提供 > 1800 秒的任何单个时间条目

    SELECT 
    service.SR_Service_RecID AS "Ticket #",
    convert(date,te.Date_Start) AS "Time Entry Day",
    m.first_name AS First,
    m.last_name AS Last,
    DATEDIFF(s, te.time_start, te.time_end) AS "Time (s)"
FROM 
    dbo.Time_Entry te
INNER JOIN dbo.Activity_Class activity ON activity.Activity_Class_RecID = te.Activity_Class_RecID
INNER JOIN dbo.SR_Service service ON te.SR_Service_RecID = service.SR_Service_RecID
INNER JOIN dbo.Member m ON m.Member_RecID = te.Member_RecID
WHERE  datediff(s,te.time_start, te.time_end) > 1800
AND activity.Description like 'T%'
AND service.Date_Entered >= dateadd(month, -1, getdate())
AND EXISTS (select *
            from dbo.SR_Team_Mbr tm
            inner join dbo.SR_Team t on tm.SR_Team_RecID = t.SR_Team_RecID and tm.Member_RecID = m.Member_RecID
            where (t.Description like '%c' or t.Description like '%d' or t.Description like '%e'))
ORDER BY service.SR_Service_RecID desc

此查询将为您获取票证,其中票证上成员的所有时间条目的总和 > 1800 秒

SELECT 
    service.SR_Service_RecID AS "Ticket #",
    convert(date,te.Date_Start) AS "Time Entry Day",
    m.first_name AS First,
    m.last_name AS Last,
    SUM(DATEDIFF(s, te.time_start, te.time_end))AS "Time (s)"
FROM 
    dbo.Time_Entry te
INNER JOIN dbo.Activity_Class activity ON activity.Activity_Class_RecID = te.Activity_Class_RecID
INNER JOIN dbo.SR_Service service ON te.SR_Service_RecID = service.SR_Service_RecID
INNER JOIN dbo.Member m ON m.Member_RecID = te.Member_RecID
WHERE  activity.Description like 'T%'
AND service.Date_Entered >= dateadd(month, -1, getdate())
AND EXISTS (select *
            from dbo.SR_Team_Mbr tm
            inner join dbo.SR_Team t on tm.SR_Team_RecID = t.SR_Team_RecID and tm.Member_RecID = m.Member_RecID
            where (t.Description like '%c' or t.Description like '%d' or t.Description like '%e'))
GROUP BY service.SR_Service_RecID, convert(date,te.Date_Start), m.First_Name, m.Last_Name
HAVING SUM(DATEDIFF(s, te.time_start, te.time_end)) > 1800
ORDER BY service.SR_Service_RecID desc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 2010-12-28
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多