Sql server 如何从同一个表返回sql中的多行

Sql server 如何从同一个表返回sql中的多行,sql-server,database,subquery,Sql Server,Database,Subquery,这里很新,需要一些帮助。我有一张桌子 TimeID(pk), DateEntry(date), EntryTiem(time), ProjID(int), ProjName(varchar), Phone(bit), Research(bit), Notes(varchar), ProjActive(bit), TimeDateStamp(date). 我试图将多行数据返回到每个ProjName中,但没有任何运气。 这是我到目前为止想到的 SELECT ProjName AS 'Proj

这里很新,需要一些帮助。我有一张桌子

TimeID(pk), DateEntry(date), EntryTiem(time), 
ProjID(int), ProjName(varchar), Phone(bit), 
Research(bit), Notes(varchar), ProjActive(bit), 
TimeDateStamp(date).
我试图将多行数据返回到每个ProjName中,但没有任何运气。 这是我到目前为止想到的

SELECT ProjName AS 'Project Name',  
    (SELECT CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 3600 AS varchar(12)) + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 60 % 60 AS varchar(2)),2)
     + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) % 60 AS varchar(2)), 2)
     FROM WorkTime
     WHERE Phone = 0 AND Research = 0 AND EntryTime IS NOT NULL
     ) AS 'Total Time No PMRE',     
    (SELECT CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 3600 AS varchar(12)) + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 60 % 60 AS varchar(2)),2) 
     + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) % 60 AS varchar(2)), 2) 
     FROM WorkTime
     WHERE Phone = 1 AND RESEARCH = 0 AND EntryTime IS NOT NULL
     ) AS 'Total Time Phone',
     (SELECT CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 3600 AS varchar(12)) + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 60 % 60 AS varchar(2)),2)
      + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) % 60 AS varchar(2)), 2)  
      FROM WorkTime
      WHERE Phone = 0 AND RESEARCH = 1 AND EntryTime IS NOT NULL
      ) AS 'Total Time Research',
      (SELECT CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 3600 AS varchar(12)) + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 60 % 60 AS varchar(2)),2)
       + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) % 60 AS varchar(2)), 2) 
       FROM WorkTime
       WHERE EntryTime IS NOT NULL
       ) AS 'TotalTime'
FROM WorkTime
WHERE EntryTime IS NOT NULL
GROUP BY ProjName   
它返回以下内容

Project Name   Total Time No PMRE   Total Time Phone   Total Time Research   Total Time
AAAA           19:06:15             2:00:00            1:00:06               22:06:21
BBBB           19:06:15             2:00:00        1:00:06               22:06:21
CCCC           19:06:15             2:00:00        1:00:06               22:06:21
DDDD           19:06:15             2:00:00        1:00:06               22:06:21
这是错误的。每列中的金额是该条件下所有ProjName相加的总和,而不是单独分开

这就是输出应该是什么

Project Name   Total Time No PMRE   Total Time Phone   Total Time Research   Total Time
AAAA           00:00:19             0:00:00            0:00:00               00:00:19
BBBB           00:00:04             0:00:00        0:00:00               00:00:04
CCCC           03:00:00             2:00:00        1:00:06               06:06:06
DDDD           16:05:52             0:00:00        0:00:00               16:05:52
有人有什么建议或可以帮我指出正确的方向吗?谢谢

您需要在外部查询中找到一些内容,可能与您分组的内容相同:

SELECT ProjName AS 'Project Name',  
    (
        SELECT CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 3600 AS varchar(12)) + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 60 % 60 AS varchar(2)),2)
        + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) % 60 AS varchar(2)), 2)
        FROM WorkTime
        WHERE Phone = 0 AND Research = 0 AND EntryTime IS NOT NULL
            AND ProjName = a.ProjName -- Correlate to outer query
    ) AS 'Total Time No PMRE',     
    (
        SELECT CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 3600 AS varchar(12)) + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 60 % 60 AS varchar(2)),2) 
        + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) % 60 AS varchar(2)), 2) 
        FROM WorkTime
        WHERE Phone = 1 AND RESEARCH = 0 AND EntryTime IS NOT NULL
            AND ProjName = a.ProjName -- Correlate to outer query
    ) AS 'Total Time Phone',
    (
        SELECT CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 3600 AS varchar(12)) + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 60 % 60 AS varchar(2)),2)
        + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) % 60 AS varchar(2)), 2)  
        FROM WorkTime
        WHERE Phone = 0 AND RESEARCH = 1 AND EntryTime IS NOT NULL
            AND ProjName = a.ProjName -- Correlate to outer query
    ) AS 'Total Time Research',
    (
        SELECT CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 3600 AS varchar(12)) + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 60 % 60 AS varchar(2)),2)
        + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) % 60 AS varchar(2)), 2) 
        FROM WorkTime
        WHERE EntryTime IS NOT NULL
            AND ProjName = a.ProjName -- Correlate to outer query
    ) AS 'TotalTime'
FROM WorkTime a -- Add alias
WHERE EntryTime IS NOT NULL
GROUP BY ProjName  
您需要在外部查询中找到某些内容,可能与您分组的内容相同:

SELECT ProjName AS 'Project Name',  
    (
        SELECT CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 3600 AS varchar(12)) + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 60 % 60 AS varchar(2)),2)
        + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) % 60 AS varchar(2)), 2)
        FROM WorkTime
        WHERE Phone = 0 AND Research = 0 AND EntryTime IS NOT NULL
            AND ProjName = a.ProjName -- Correlate to outer query
    ) AS 'Total Time No PMRE',     
    (
        SELECT CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 3600 AS varchar(12)) + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 60 % 60 AS varchar(2)),2) 
        + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) % 60 AS varchar(2)), 2) 
        FROM WorkTime
        WHERE Phone = 1 AND RESEARCH = 0 AND EntryTime IS NOT NULL
            AND ProjName = a.ProjName -- Correlate to outer query
    ) AS 'Total Time Phone',
    (
        SELECT CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 3600 AS varchar(12)) + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 60 % 60 AS varchar(2)),2)
        + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) % 60 AS varchar(2)), 2)  
        FROM WorkTime
        WHERE Phone = 0 AND RESEARCH = 1 AND EntryTime IS NOT NULL
            AND ProjName = a.ProjName -- Correlate to outer query
    ) AS 'Total Time Research',
    (
        SELECT CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 3600 AS varchar(12)) + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 60 % 60 AS varchar(2)),2)
        + ':' + RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) % 60 AS varchar(2)), 2) 
        FROM WorkTime
        WHERE EntryTime IS NOT NULL
            AND ProjName = a.ProjName -- Correlate to outer query
    ) AS 'TotalTime'
FROM WorkTime a -- Add alias
WHERE EntryTime IS NOT NULL
GROUP BY ProjName  

我认为您需要的是一个条件和:

SELECT ProjName AS 'Project Name',  
    SUM(CASE WHEN (Phone = 0 AND Research = 0 AND EntryTime IS NOT NULL) THEN DATEDIFF(second, 0, EntryTime) ELSE NULL END) AS 'Total Time No PMRE',
    SUM(CASE WHEN (Phone = 1 AND RESEARCH = 0 AND EntryTime IS NOT NULL) THEN DATEDIFF(second, 0, EntryTime) ELSE NULL END) AS 'Total Time Phone',
    SUM(CASE WHEN (Phone = 0 AND RESEARCH = 1 AND EntryTime IS NOT NULL) THEN DATEDIFF(second, 0, EntryTime) ELSE NULL END) AS 'Total Time Research',
    SUM(DATEDIFF(second, 0, EntryTime)) AS 'TotalTime'
FROM WorkTime
WHERE EntryTime IS NOT NULL
GROUP BY ProjName
将您的格式代码添加到SUM结果中,您就可以了

编辑 回答您对格式的评论,采用您的格式“模板”:

并将每次出现的
SUM(DATEDIFF(second,0,EntryTime)
替换为
SUM(当(Phone=0,Research=0,EntryTime不为空时),然后替换DATEDIFF(second,0,EntryTime)或NULL END)

或者,您可以在包装源查询的查询中添加格式,如下所示:

SELECT CAST([Total Time No PMRE] / 3600 AS varchar(12)) + ':' + RIGHT('0' + CAST([Total Time No PMRE] / 60 % 60 AS varchar(2)),2)
    + ':' + RIGHT('0' + CAST(([Total Time No PMRE] % 60 AS varchar(2)), 2)
... -- The other columns
FROM (
    SELECT ProjName AS 'Project Name',
        SUM(CASE WHEN (Phone = 0 AND Research = 0 AND EntryTime IS NOT NULL) THEN DATEDIFF(second, 0, EntryTime) ELSE NULL END) AS 'Total Time No PMRE',
        SUM(CASE WHEN (Phone = 1 AND RESEARCH = 0 AND EntryTime IS NOT NULL) THEN DATEDIFF(second, 0, EntryTime) ELSE NULL END) AS 'Total Time Phone',
        SUM(CASE WHEN (Phone = 0 AND RESEARCH = 1 AND EntryTime IS NOT NULL) THEN DATEDIFF(second, 0, EntryTime) ELSE NULL END) AS 'Total Time Research',
        SUM(DATEDIFF(second, 0, EntryTime)) AS 'TotalTime'
    FROM WorkTime
    WHERE EntryTime IS NOT NULL
    GROUP BY ProjName
 ) AS ds

希望这对您有所帮助

我认为您需要的是一个条件和:

SELECT ProjName AS 'Project Name',  
    SUM(CASE WHEN (Phone = 0 AND Research = 0 AND EntryTime IS NOT NULL) THEN DATEDIFF(second, 0, EntryTime) ELSE NULL END) AS 'Total Time No PMRE',
    SUM(CASE WHEN (Phone = 1 AND RESEARCH = 0 AND EntryTime IS NOT NULL) THEN DATEDIFF(second, 0, EntryTime) ELSE NULL END) AS 'Total Time Phone',
    SUM(CASE WHEN (Phone = 0 AND RESEARCH = 1 AND EntryTime IS NOT NULL) THEN DATEDIFF(second, 0, EntryTime) ELSE NULL END) AS 'Total Time Research',
    SUM(DATEDIFF(second, 0, EntryTime)) AS 'TotalTime'
FROM WorkTime
WHERE EntryTime IS NOT NULL
GROUP BY ProjName
将您的格式代码添加到SUM结果中,您就可以了

编辑 回答您对格式的评论,采用您的格式“模板”:

并将每次出现的
SUM(DATEDIFF(second,0,EntryTime)
替换为
SUM(当(Phone=0,Research=0,EntryTime不为空时),然后替换DATEDIFF(second,0,EntryTime)或NULL END)

或者,您可以在包装源查询的查询中添加格式,如下所示:

SELECT CAST([Total Time No PMRE] / 3600 AS varchar(12)) + ':' + RIGHT('0' + CAST([Total Time No PMRE] / 60 % 60 AS varchar(2)),2)
    + ':' + RIGHT('0' + CAST(([Total Time No PMRE] % 60 AS varchar(2)), 2)
... -- The other columns
FROM (
    SELECT ProjName AS 'Project Name',
        SUM(CASE WHEN (Phone = 0 AND Research = 0 AND EntryTime IS NOT NULL) THEN DATEDIFF(second, 0, EntryTime) ELSE NULL END) AS 'Total Time No PMRE',
        SUM(CASE WHEN (Phone = 1 AND RESEARCH = 0 AND EntryTime IS NOT NULL) THEN DATEDIFF(second, 0, EntryTime) ELSE NULL END) AS 'Total Time Phone',
        SUM(CASE WHEN (Phone = 0 AND RESEARCH = 1 AND EntryTime IS NOT NULL) THEN DATEDIFF(second, 0, EntryTime) ELSE NULL END) AS 'Total Time Research',
        SUM(DATEDIFF(second, 0, EntryTime)) AS 'TotalTime'
    FROM WorkTime
    WHERE EntryTime IS NOT NULL
    GROUP BY ProjName
 ) AS ds

希望这有助于您

我在运行此查询时收到以下消息…Msg 8117,16级,状态1,第2行操作数数据类型时间对于求和运算符无效。感谢Agustin,我对此表示感谢。不幸的是,我在尝试添加格式化代码时收到错误消息。“无法在包含聚合或子查询的表达式上执行聚合函数。”我可以尝试一下,并提出了一些与您在这里看到的内容非常类似的内容(请参阅我之前发布的有关解决方案的评论)但是在格式和错误代码方面遇到了同样的问题。我感谢您的帮助。对格式有什么想法吗?当我运行此查询时,我收到以下消息…Msg 8117,16级,状态1,第2行操作数数据类型时间对于求和运算符无效。谢谢Agustin,我很感激。不幸,我在尝试添加for时收到错误消息matting code.“无法对包含聚合或子查询的表达式执行聚合函数。”我可以尝试一下,并提出了与您在这里看到的内容非常类似的内容(请参阅我之前发布的有关解决方案的评论)但是在格式和错误代码方面遇到了同样的问题。我很感谢您的帮助。关于格式有什么想法吗?选择ProjName作为“项目名称”,[Total Time No PMRE]=CONVERT(VARCHAR(10),SUM(手机=0和研究=0时的情况下)然后(DATEDIFF(分钟,0,入口时间))/3600 END)),[Total Time Phone]=CONVERT(VARCHAR(10),SUM(当Phone=1且Research=0时,则为(DATEDIFF(MINUTE,0,EntryTime))结束),[Total Time Research]=CONVERT(VARCHAR(10),SUM(当Phone=0且Research=1时,则为(DATEDIFF(MINUTE,0,EntryTime))结束),[TotalTime]=CONVERT(VARCHAR(10),SUM(DATEDIFF(MINUTE,0,EntryTime)))从WorkTime WHERE EntryTime NOT NULL GROUP BY ProjNameI使用上述查询使其工作,但现在我很难使其转换时间,当我尝试格式化时,我得到以下消息…Msg 130,级别15,状态1,第3行无法对包含聚合或子查询的表达式执行聚合函数。any建议。另外,感谢所有人的指导!@Agustine-感谢您的帮助。通过您发布的信息以及一些额外的搜索和帮助,我能够找到答案。最终使用了条件和和CTE,它与格式一起工作。再次感谢。选择ProjName作为“项目名称”,[Total Time No PMRE]=转换(VARCHAR(10),SUM(电话=0,研究=0时的情况下,然后(DATEDIFF(分钟,0,入口时间))/3600结束)),[Total Time Phone]=转换(VARCHAR(10),SUM(电话=1,研究=0时的情况下,然后(DATEDIFF(分钟,0,入口时间))结束),[Total Time Research]=转换(VARCHAR(10),SUM(当Phone=0,Research=1时,则为(DATEDIFF(分钟,0,入口时间))结束),[TotalTime]=CONVERT(VARCHAR(10),SUM(DATEDIFF(分钟,0,入口时间)))从WorkTime WHERE EntryTime NOT NULL GROUP BY ProjNameI使用上述查询使其工作,但现在我很难使其转换时间,当我尝试格式化时,我得到以下消息…Msg 130,级别15,状态1,第3行无法对包含聚合或子查询的表达式执行聚合函数。any建议。另外,感谢大家的指导!@Agustine-感谢您的帮助。通过您发布的信息以及一些额外的搜索和帮助,我能够找到答案。最后使用了条件和和CTE,并且它与格式一起工作。再次感谢。