Sql server 如何根据子查询结果聚合数据
我有这样一个sql查询: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
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