Таблица SQL с промежуточным итогом

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


person user1276898    schedule 18.03.2012    source источник
comment
некоторые движки поддерживают функции LEAD и LAG, которые могут вам здесь помочь. (ИЛИ - используйте генератор отчетов)   -  person Randy    schedule 18.03.2012
comment
Я только что нашел решение, но промежуточный итог, который я придумал, составил 4000 и 2500 вместо 4000 и 2500. Может ли кто-нибудь сказать мне, как преобразовать их в этот формат? большое тебе спасибо.   -  person user1276898    schedule 18.03.2012
comment
Взгляните на функцию FORMAT(), хотя я действительно не понимаю, почему вы хотите отформатировать totalBudget и totalActual, но вернуть Budget и Actual без форматирования.   -  person Andriy M    schedule 18.03.2012
comment
Инструменты отчетности предназначены для форматирования данных; SQL для выбора. Если ваши инструменты отчетности не могут форматировать данные, приобретите более совершенные инструменты отчетности.   -  person Jonathan Leffler    schedule 19.03.2012
comment
andriy - Большое спасибо и спасибо всем за ответы.   -  person user1276898    schedule 19.03.2012


Ответы (2)


Попробуй это:

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

person Mosty Mostacho    schedule 18.03.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 
person Tahbaza    schedule 18.03.2012
comment
привет, спасибо за ваш ответ. Для приведенного выше кода он показывает общий бюджет и общий фактический объем в каждой строке. Я хотел бы, чтобы он отображался только в последней строке казеида. В этом случае отображаются только строки 413 1215 и 414 1217. Является ли это возможным? - person user1276898; 18.03.2012
comment
мой папа хочет показать общий бюджет и общую фактическую стоимость для каждого случая, и он не хочет, чтобы общая сумма показывала каждую строку, потому что у него немного кружится голова. - person user1276898; 18.03.2012