【问题标题】:How do I group results in columns using case statements?如何使用 case 语句将结果分组到列中?
【发布时间】:2019-08-19 16:37:04
【问题描述】:

我想将结果分组到单独的列中,如 Idle TotalLock Total 等。我不是程序员,当然也不是数据库管理员,所以我可能没有所有工具和访问权限,但我会很感激任何帮助。

我尝试过使用其他方法,这里和其他网站,但总是归结为 SUMGROUP BY 函数,我对此知之甚少。

SELECT TOP 10000
    AGENT.AGENT_NAME,
    ID.AGENT_ID,
    TIME.DURATION_SECONDS,
    SUM(CASE 
           WHEN ID.AGENT_ID IN ('IDLE','LOCK','LOGIN') 
              THEN 'WORKSTATE' 
           ELSE NULL 
        END)
FROM 
    WORKSTATE TIME
LEFT JOIN 
    DATABASE ID ON ID.INDEX = TIME.AGENT_INDEX
LEFT JOIN 
    DATABASE ORG ON TIME.AGENT_LOGIN_ID = ORG.AGENT_NAME
WHERE 
    (TIME.START_TIME = 2019-08-19) AND ORG.TEAM IN 'COMPANY'
GROUP BY 
    AGENT_AGENT_NAME,
    ID.AGENT_ID,
    TIME.DURATION_SECONDS

我希望将结果对代理在给定日期空闲、锁定或登录的总时间进行分组。

Date Name Idle hrs Lock hrs Login
---  ---  ------    ------  -----
08/19 John   2.3      1.7     4

【问题讨论】:

  • 您需要在 select 语句中添加四列才能在输出中获得四列。不知道您要为哪个列创建总和。你有一个字符串文字,它会爆炸,因为对字符串求和不起作用。
  • 符合预期结果的样本数据将对我们有很大帮助。
  • 这看起来像是一个使用 SQL Server 的 PIVOT 操作的机会。 docs.microsoft.com/en-us/sql/t-sql/queries/…
  • 这里有多个问题。首先,值 2019-08-19 是一个数学表达式 - 所以这不起作用。接下来,您不能对字符串求和 - 这是您的 case 表达式返回的内容。使用没有 order by 子句的 TOP 将返回一组未定义的行。您有一个名称包含“秒”的列,但您想要的输出意味着小时。显然有一些数学可以在单位之间进行转换。因此,从一个为特定人员和日期选择行的基本查询开始。然后逐步建立。

标签: sql-server sum case-when


【解决方案1】:

您需要为每一列添加CASE 表达式,以下查询将帮助您开始:

SELECT 
    TIME.START_TIME,
    TIME.AGENT_LOGIN_ID,
    SUM(CASE 
           WHEN ID.AGENT_ID = 'IDLE'
              THEN TIME.DURATION_SECONDS  END) as IdleTime, -- You may calculate You can formula to get HOURS from SECONDS or replace the column "DURATION_SECONDS" with the one that you looking to do aggregation
    SUM(CASE 
        WHEN ID.AGENT_ID = 'LOCK'
            THEN TIME.DURATION_SECONDS  END) as LockTime, 
    SUM(CASE 
        WHEN ID.AGENT_ID = 'LOGIN'
            THEN TIME.DURATION_SECONDS  END) as LogTime
FROM WORKSTATE TIME
LEFT JOIN 
    DATABASE ID ON TIME.AGENT_INDEX = ID.INDEX
LEFT JOIN 
    DATABASE ORG ON TIME.AGENT_LOGIN_ID = ORG.AGENT_NAME
WHERE 
    (TIME.START_TIME = 2019-08-19) AND ORG.TEAM = 'COMPANY'
GROUP BY 
     TIME.START_TIME, TIME.AGENT_LOGIN_ID,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2021-09-24
    • 2021-12-09
    • 1970-01-01
    相关资源
    最近更新 更多