Таблица SQL с промежуточной суммой - PullRequest
0 голосов
/ 18 марта 2012

Я новичок в этом вопросе 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: мне очень жаль, я не знаю, как показать всю эту информацию в таблице.

Ответы [ 2 ]

3 голосов
/ 18 марта 2012

Попробуйте:

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: Обратите внимание, что ваши общие фактическиенеправильно.Вы должны обновить свой вопрос

0 голосов
/ 18 марта 2012

Существуют специфичные для базы данных расширения для SQL (например, ROLLUP в t-sql), которые могут помочь с этим, но, поскольку вы не предоставили достаточно информации о платформе, на которой вы работаете, вот прямой 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 
...