0

我是这个 SQL 的新手。我有一张如下表:

Table dataTable

caseID  Title   staffID  staffName  Date        Budget  Actual
------  ------  -------  ---------  ----------  ------  ------
413     Week 1  1213     Jackson    1990-10-07  1000    1000
413     Week 1  1214     Jeckson    1990-10-07  2000    1500
413     Week 2  1215     Jickson    1990-10-07  1000    1500 
414     Week 2  1216     Jockson    1990-10-08  1500    1000 
414     Week 2  1217     Juckson    1990-10-08  2000    1000

我想要的结果如下;

显示表中的每一个细节,但也显示总预算和总实际组按 caseID

caseID  staffID  staffName  Date        Budget  Actual  totalBudget  totalActual
------  -------  ---------  ----------  ------  ------  -----------  -----------
413     1213     Jackson    1990-10-07  1000    1000
413     1214     Jeckson    1990-10-07  2000    1500
413     1215     Jickson    1990-10-07  1000    1500    4,000        2,500
414     1216     Jockson    1990-10-08  1500    1000 
414     1217     Juckson    1990-10-08  2000    1000    3,500        1,000

有人可以帮我写代码吗?我做不到。

ps:真的很抱歉我不知道如何在表格中显示所有这些信息。

4

2 回答 2

3

尝试这个:

select
  t1.caseID, t1.staffID, t1.staffName, t1.Date, t1.Budget, t1.Actual, 
  format(t2.totalBudget, 0) TotalBudget, format(t2.totalActual, 0) TotalActual
from t t1 left join (
  select caseID, max(staffId) staffId, sum(Budget) totalBudget,
  sum(Actual) totalActual from t
  group by caseID
) t2 on t1.caseID = t2.caseID and t1.staffId = t2.staffId

结果是:

+--------+---------+-----------+------------+--------+--------+-------------+-------------+
| CASEID | STAFFID | STAFFNAME |    DATE    | BUDGET | ACTUAL | TOTALBUDGET | TOTALACTUAL |
+--------+---------+-----------+------------+--------+--------+-------------+-------------+
|    413 |    1213 | Jackson   | 07-10-1990 |   1000 |   1000 |             |             |
|    413 |    1214 | Jeckson   | 07-10-1990 |   2000 |   1500 |             |             |
|    413 |    1215 | Jickson   | 07-10-1990 |   1000 |   1500 |       4,000 |       4,000 |
|    414 |    1216 | Jockson   | 08-10-1990 |   1500 |   1000 |             |             |
|    414 |    1217 | Juckson   | 08-10-1990 |   2000 |   1000 |       3,500 |       2,000 |
+--------+---------+-----------+------------+--------+--------+-------------+-------------+

如果您有任何问题,请告诉我。

PS:请注意您的总实际值是错误的。你应该更新你的问题

于 2012-03-18T18:41:21.800 回答
0

有特定于数据库的 SQL 扩展(如t-sql 中的ROLLUP)可以帮助解决这个问题,但由于您没有在运行的平台上提供足够的信息,这里有一个直接的 SQL 解决方案,只要您的平台有效支持嵌套(派生)表。

根据您的示例,将总行放在结果中的那个点似乎没有任何逻辑,所以我只是将相关结果添加到每一行。

SELECT a.caseID, a.staffID, a.staffName, a.Date, a.Budget, a.Actual, 
  b.totalBudget, b.totalActual
FROM tbl a INNER JOIN (
  SELECT caseID, SUM(Budget) as totalBudget, SUM(Actual) as totalActual
  FROM tbl 
  GROUP BY caseID
) b ON a.caseID = b.caseID 
于 2012-03-18T13:58:37.217 回答