Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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 server 如何根据子查询结果聚合数据_Sql Server - Fatal编程技术网

Sql server 如何根据子查询结果聚合数据

Sql server 如何根据子查询结果聚合数据,sql-server,Sql Server,我有这样一个sql查询: SELECT (SUM(DURATIONSECS) / 3600.00) AS LaborHrs, (SELECT LABORLEV2 t2 FROM LABOR WHERE LABORID = t1.LABORID) As Dept FROM Table1 t1 WHERE DTM BETWEEN 'datetime1' AND 'datetime2' AND (SELECT LABORLEV1 FROM LABOR WHERE LABORID = t1.LAB

我有这样一个sql查询:

SELECT (SUM(DURATIONSECS) / 3600.00) AS LaborHrs, 
(SELECT LABORLEV2 t2 FROM LABOR WHERE LABORID = t1.LABORID) As Dept
FROM Table1 t1 
WHERE DTM BETWEEN 'datetime1' AND 'datetime2' AND 
(SELECT LABORLEV1 FROM LABOR WHERE LABORID = t1.LABORID) = '100' 
AND PAYCODEID='1'
Group BY LABORID
SELECT 
    l.LABORLEV2 AS Dept,
    (SUM(t1.DURATIONSECS) / 3600.00) AS LaborHrs
FROM Table1 t
INNER JOIN LABOR l ON t.LABORID=l.LABORID
WHERE 
    l.LABORLEV1='100' AND
    t1.PAYCODEID='1' AND
    t1.DTM BETWEEN 'datetime1' AND 'datetime2'
GROUP BY l.LABORLEV2
这为我提供了如下正确数据:

LaborHrs        Dept
90.5000000      office
1033.2500000    retail
522.2500000     retail
217.5000000     misc
1145.5000000    misc
40.0000000      retail

但是,如果部门名称相同,我需要汇总结果,例如,我需要将“零售”和“杂项”的所有工时总和放在同一列中。我尝试过按部门分组,但它没有识别出该列名。

我根据对您问题的理解重新编写了您的查询,但我对这一部分非常怀疑:

DTM BETWEEN 'datetime1' AND 'datetime2'
我假设它是一个datetime变量或数字,您可以在中替换它。 如果是这样的话,我想这里可能是答案

SELECT (SUM(DURATIONSECS) / 3600.00) AS LaborHrs, 
    , l1.LABORLEV2 AS Dept
FROM Table1 t1 
    JOIN LABOR l1 ON l1 ON l1.LABORID=t1.LABORID
WHERE DTM BETWEEN 'datetime1' AND 'datetime2' AND l1.LABORLEV1='100'
    AND t1.PAYCODEID='1'
Group BY t1.LABORID, l1.LABORLEV2

根据我对你问题的理解,我重写了你的问题,但我对这一部分相当怀疑:

DTM BETWEEN 'datetime1' AND 'datetime2'
我假设它是一个datetime变量或数字,您可以在中替换它。 如果是这样的话,我想这里可能是答案

SELECT (SUM(DURATIONSECS) / 3600.00) AS LaborHrs, 
    , l1.LABORLEV2 AS Dept
FROM Table1 t1 
    JOIN LABOR l1 ON l1 ON l1.LABORID=t1.LABORID
WHERE DTM BETWEEN 'datetime1' AND 'datetime2' AND l1.LABORLEV1='100'
    AND t1.PAYCODEID='1'
Group BY t1.LABORID, l1.LABORLEV2

如果要对某些列进行分组,则该列不能是子选择,因此必须使用联接重写查询

根据我对您的查询的了解,您可以连接表Tabl1和人工,并将您的条件移动到一个WHERE语句,如下所示:

SELECT (SUM(DURATIONSECS) / 3600.00) AS LaborHrs, 
(SELECT LABORLEV2 t2 FROM LABOR WHERE LABORID = t1.LABORID) As Dept
FROM Table1 t1 
WHERE DTM BETWEEN 'datetime1' AND 'datetime2' AND 
(SELECT LABORLEV1 FROM LABOR WHERE LABORID = t1.LABORID) = '100' 
AND PAYCODEID='1'
Group BY LABORID
SELECT 
    l.LABORLEV2 AS Dept,
    (SUM(t1.DURATIONSECS) / 3600.00) AS LaborHrs
FROM Table1 t
INNER JOIN LABOR l ON t.LABORID=l.LABORID
WHERE 
    l.LABORLEV1='100' AND
    t1.PAYCODEID='1' AND
    t1.DTM BETWEEN 'datetime1' AND 'datetime2'
GROUP BY l.LABORLEV2

如果要对某些列进行分组,则该列不能是子选择,因此必须使用联接重写查询

根据我对您的查询的了解,您可以连接表Tabl1和人工,并将您的条件移动到一个WHERE语句,如下所示:

SELECT (SUM(DURATIONSECS) / 3600.00) AS LaborHrs, 
(SELECT LABORLEV2 t2 FROM LABOR WHERE LABORID = t1.LABORID) As Dept
FROM Table1 t1 
WHERE DTM BETWEEN 'datetime1' AND 'datetime2' AND 
(SELECT LABORLEV1 FROM LABOR WHERE LABORID = t1.LABORID) = '100' 
AND PAYCODEID='1'
Group BY LABORID
SELECT 
    l.LABORLEV2 AS Dept,
    (SUM(t1.DURATIONSECS) / 3600.00) AS LaborHrs
FROM Table1 t
INNER JOIN LABOR l ON t.LABORID=l.LABORID
WHERE 
    l.LABORLEV1='100' AND
    t1.PAYCODEID='1' AND
    t1.DTM BETWEEN 'datetime1' AND 'datetime2'
GROUP BY l.LABORLEV2

GROUP BY仅在您选择的列已通过FROM子句可用时起作用,因此您需要将其加入。GROUP BY仅在您选择的列已通过FROM子句可用时起作用,因此您需要将其加入。抱歉,我应该指定我刚刚将datetime值更改为datetime1和datetime2。谢谢,我唯一需要更改的是Group BY子句中的l1.LABORLEV2到PAYCODEID。我应该指定我刚刚将datetime值更改为datetime1和datetime2。谢谢,我唯一需要更改的是Group BY子句中的l1.LABORLEV2到PAYCODEID