Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 子查询上的分组依据不返回任何结果_Sql_Sql Server - Fatal编程技术网

Sql 子查询上的分组依据不返回任何结果

Sql 子查询上的分组依据不返回任何结果,sql,sql-server,Sql,Sql Server,首先介绍一下我要做的事情的背景: 时间是根据工作记录的,工作被组织成工作组,我试图计算工作组级别上记录的小时数 问题是如何存储小时数,如果有人知道系统,则使用“10000英尺” 对于每个作业+用户+天,有两行,一行显示计划时间,另一行显示“实际”时间;虽然如果用户没有确认他们的计划小时数(如果没有差异,大多数用户不会确认),但实际小时数为空,并且计划小时数是需要使用的小时数 因此,最好的方法是将这两条线组合在一起,当实际小时数为空时,使用计划的小时数 完全查询中的子查询本身运行良好,并显示正确的

首先介绍一下我要做的事情的背景:

时间是根据工作记录的,工作被组织成工作组,我试图计算工作组级别上记录的小时数

问题是如何存储小时数,如果有人知道系统,则使用“10000英尺”

对于每个作业+用户+天,有两行,一行显示计划时间,另一行显示“实际”时间;虽然如果用户没有确认他们的计划小时数(如果没有差异,大多数用户不会确认),但实际小时数为空,并且计划小时数是需要使用的小时数

因此,最好的方法是将这两条线组合在一起,当实际小时数为空时,使用计划的小时数

完全查询中的子查询本身运行良好,并显示正确的小时数

当放置在较大的查询中时,它显示空结果;删除子查询中的GROUP BY,当actual为NULL时,它会显示数据,但不会将计划小时数计算到总数中

我知道答案就在这个问题上,但我一直在绕圈子

任何让我从另一个角度思考这个问题的建议都是非常受欢迎的

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';