2017-06-22 69 views
1

您好我已经写了查询下面的问题,我的问题是显然返回整个表的总和(所有员工在一起),我希望它返回每个员工的总和,这完全有可能吗?获取每个SQL行的总和

DECLARE @temp TABLE 
(
TotalAmount DECIMAL, 
ExpenseCategory UNIQUEIDENTIFIER, 
EmployeeId UNIQUEIDENTIFIER, 
CategoryName NVARCHAR(100) 
) 

INSERT INTO @temp 

SELECT SUM(dbo.ExpenseDetails.TotalAmount) AS TotalAmount,   
dbo.ExpenseDetails.ExpenseCategory, dbo.ExpenseDetails.EmployeeId, 
dbo.ExpensesCategories.CategoryName 
FROM   dbo.ExpenseDetails INNER JOIN 
        dbo.ExpensesCategories ON 
dbo.ExpenseDetails.ExpenseCategory = dbo.ExpensesCategories.CategoryId 
WHERE  (CONVERT(DATE, dbo.ExpenseDetails.DateAdded) < CONVERT(DATE, 
DATEADD(m, DATEDIFF(m, 0, CONVERT(DATE, GETDATE())), 23 - 1))) AND 
(CONVERT(DATE, dbo.ExpenseDetails.DateAdded) > CONVERT(DATE, 
         DATEADD(MONTH, - 1, DATEADD(m, DATEDIFF(m, 0, 
CONVERT(DATE, GETDATE())), 23 - 1)))) 
GROUP BY dbo.ExpenseDetails.ExpenseCategory, dbo.ExpenseDetails.EmployeeId, 
dbo.ExpensesCategories.CategoryName 

SELECT 
EmployeeId, 
(SELECT SUM(TotalAmount) FROM @temp WHERE EmployeeId = [@temp].EmployeeId 
and ExpenseCategory = '6CC0F801-D295-4997-9D1F-3E5B2BE692ED') AS TotalFuel, 
(SELECT SUM(TotalAmount) FROM @temp WHERE EmployeeId = [@temp].EmployeeId 
and ExpenseCategory = '3E54C10B-ECBE-4B28-87A4-5A4E43AACDFC') AS TotalRail, 
(SELECT SUM(TotalAmount) FROM @temp WHERE EmployeeId = [@temp].EmployeeId 
and ExpenseCategory = '31CC43A4-80E6-4DD4-A28C-039F05AF62A3') AS 
TotalParking, 
(SELECT SUM(TotalAmount) FROM @temp WHERE EmployeeId = [@temp].EmployeeId 
and ExpenseCategory = '01250A30-3865-40D2-9E49-DA2B9898B1F4') AS 
TotalMileage, 
(SELECT SUM(TotalAmount) FROM @temp WHERE EmployeeId = [@temp].EmployeeId 
and ExpenseCategory = 'F4E4582D-DEDF-499D-BBC1-45003B865218') AS TotalEquip, 
(SELECT SUM(TotalAmount) FROM @temp WHERE EmployeeId = [@temp].EmployeeId 
and ExpenseCategory = '55F471C1-6E52-4898-8263-0B7684B78E7C') AS TotalPPS, 
(SELECT SUM(TotalAmount) FROM @temp WHERE EmployeeId = [@temp].EmployeeId 
and ExpenseCategory = '1EE0FC40-193F-4720-9143-0B61FFDE7B8D') AS TotalOther 

FROM @temp GROUP BY EmployeeId 

回答

1

使用SUM与条件:

SELECT 
    EmployeeId, 
    TotalFuel = SUM(CASE WHEN ExpenseCategory = '6CC0F801-D295-4997-9D1F-3E5B2BE692ED' THEN TotalAmount END) 
FROM @temp 
GROUP BY EmployeeId 
+0

米哈伊尔·你好,这工作得很好,唯一的问题是现在,它不会让我组由雇员,所以我结束了重复行。 –

+0

我错过了。随着'组',你不需要'OVER' –

+0

干杯米哈伊尔,伟大的工程! –

0
SELECT 
EmployeeId, 
(SELECT SUM(TotalAmount) FROM @temp WHERE ExpenseCategory = '6CC0F801-D295-4997-9D1F-3E5B2BE692ED') AS TotalFuel, 
(SELECT SUM(TotalAmount) FROM @temp WHERE ExpenseCategory = '3E54C10B-ECBE-4B28-87A4-5A4E43AACDFC') AS TotalRail, 
(SELECT SUM(TotalAmount) FROM @temp WHERE ExpenseCategory = '31CC43A4-80E6-4DD4-A28C-039F05AF62A3') AS TotalParking, 
(SELECT SUM(TotalAmount) FROM @temp WHERE ExpenseCategory = '01250A30-3865-40D2-9E49-DA2B9898B1F4') AS TotalMileage, 
(SELECT SUM(TotalAmount) FROM @temp WHERE ExpenseCategory = 'F4E4582D-DEDF-499D-BBC1-45003B865218') AS TotalEquip, 
(SELECT SUM(TotalAmount) FROM @temp WHERE ExpenseCategory = '55F471C1-6E52-4898-8263-0B7684B78E7C') AS TotalPPS, 
(SELECT SUM(TotalAmount) FROM @temp WHERE ExpenseCategory = '1EE0FC40-193F-4720-9143-0B61FFDE7B8D') AS TotalOther 
FROM @temp GROUP BY EmployeeId 

Can you try this? 
Usually when Group By is used it should be followed with "having" at the end. It should not be present in where condition 
+0

那肯定会给我这个表的总和。 –

+0

最后添加条件Group By EmployeeId拥有EmployeeId =(或条件) –