Sql 子查询上的分组依据不返回任何结果
首先介绍一下我要做的事情的背景: 时间是根据工作记录的,工作被组织成工作组,我试图计算工作组级别上记录的小时数 问题是如何存储小时数,如果有人知道系统,则使用“10000英尺” 对于每个作业+用户+天,有两行,一行显示计划时间,另一行显示“实际”时间;虽然如果用户没有确认他们的计划小时数(如果没有差异,大多数用户不会确认),但实际小时数为空,并且计划小时数是需要使用的小时数 因此,最好的方法是将这两条线组合在一起,当实际小时数为空时,使用计划的小时数 完全查询中的子查询本身运行良好,并显示正确的小时数 当放置在较大的查询中时,它显示空结果;删除子查询中的GROUP BY,当actual为NULL时,它会显示数据,但不会将计划小时数计算到总数中 我知道答案就在这个问题上,但我一直在绕圈子 任何让我从另一个角度思考这个问题的建议都是非常受欢迎的Sql 子查询上的分组依据不返回任何结果,sql,sql-server,Sql,Sql Server,首先介绍一下我要做的事情的背景: 时间是根据工作记录的,工作被组织成工作组,我试图计算工作组级别上记录的小时数 问题是如何存储小时数,如果有人知道系统,则使用“10000英尺” 对于每个作业+用户+天,有两行,一行显示计划时间,另一行显示“实际”时间;虽然如果用户没有确认他们的计划小时数(如果没有差异,大多数用户不会确认),但实际小时数为空,并且计划小时数是需要使用的小时数 因此,最好的方法是将这两条线组合在一起,当实际小时数为空时,使用计划的小时数 完全查询中的子查询本身运行良好,并显示正确的
SELECT
g1.om_number AS "Job Group Number",
(
SELECT
CASE
WHEN SUM(tkte2.TimeEntries_Hours) IS NOT NULL
THEN SUM(tkte2.TimeEntries_Hours)
ELSE
(
CASE
WHEN SUM(tkte2.TimeEntries_Scheduled_Hours) IS NOT NULL
THEN SUM(tkte2.TimeEntries_Scheduled_Hours)
ELSE 0
END
)
END
FROM TenK.TimeEntries AS tkte2
INNER JOIN TenK.Projects AS tkp2 ON tkp2.Projects_Id=tkte2.TimeEntries_Assignable_Id
INNER JOIN om.Job AS j2 ON tkp2.Projects_Code=j2.om_number
WHERE j2.om_jobGroup_id=g1.om_id
GROUP BY tkte2.TimeEntries_Assignable_Id,tkte2.TimeEntries_User_Id,tkte2.TimeEntries_Date
) AS "Hours"
FROM om.jobGroup AS g1
INNER JOIN om.Project AS p1 ON g1.om_project_id=p1.om_id
WHERE (CONVERT(date, p1.om_creationDate) BETWEEN CONVERT(date,'2016-01-01 00:00:00') AND CONVERT(date,'2019-12-31 23:59:59'))
AND g1.om_number='TESTJOB-01'
我已经使用outerapply优化了您的查询,并确保包含必要的group(able)字段 查询更简单、更清晰 顺便说一句,确保
(j2.om\u jobGroup\u id=g1.om\u id)
匹配,否则它将返回空
```
```今天的提示:
COALESCE()
!那么一个和(COALESE((选择SUB1),(选择sub2),0))?嗯,我没想到!我要试一试;谢谢!:)你用哪一种?“SQL”只是一种查询语言,而不是特定数据库产品的名称(并且您的查询使用一些非标准函数)。请为您正在使用的数据库产品添加一个“postgresql
,oracle
,sql server
,db2
,…Microsoft sql server 2012我在标记选项中找不到它。”。我认为在我最初的查询中唯一的非标准是CONVERT,它被用作文本字段格式的日期,并在末尾附加了UTC时间+0000等。因此,我转换为日期,以便更准确地进行间隔。这将返回正确的结果-谢谢我将看看是否可以在完整查询中使用它,而不会出现任何爆炸:)如果它解决了您的问题,您应该在@StevenW接受此答案。下次在基于列的查询中始终使用外部应用。如果您对其进行分析,则会产生重大影响。干杯
SELECT
g1.om_number AS [Job Group Number]
, COALESCE(H.TimeEntries_Hours_SUM, H.TimeEntries_Scheduled_Hours_SUM) AS Hours
FROM om.jobGroup AS g1
INNER JOIN om.Project AS p1 ON g1.om_project_id=p1.om_id
OUTER APPLY
(
SELECT tkte2.TimeEntries_Assignable_Id
, tkte2.TimeEntries_User_Id
, tkte2.TimeEntries_Date
, SUM(tkte2.TimeEntries_Hours) AS TimeEntries_Hours_SUM
, SUM(tkte2.TimeEntries_Scheduled_Hours) AS TimeEntries_Scheduled_Hours_SUM
FROM TenK.TimeEntries AS tkte2
INNER JOIN TenK.Projects AS tkp2 ON tkp2.Projects_Id = tkte2.TimeEntries_Assignable_Id
INNER JOIN om.Job AS j2 ON tkp2.Projects_Code=j2.om_number
WHERE (j2.om_jobGroup_id = g1.om_id)
GROUP BY tkte2.TimeEntries_Assignable_Id, tkte2.TimeEntries_User_Id, tkte2.TimeEntries_Date
) H
WHERE (CONVERT(date, p1.om_creationDate) BETWEEN CONVERT(date,'2016-01-01 00:00:00') AND CONVERT(date,'2019-12-31 23:59:59'))
AND g1.om_number='TESTJOB-01';