Создание общей строки в таблице базы данных SQL

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

Я пытаюсь создать запрос, который добавит дополнительную строку в базу данных, которая является итоговой.

Ниже то, с чего я начинаю:

 PerfAttribAlphaID  ProductID   AsOfDate    AlphaSourceDesc   PerfAttribValue
1                 1        2014-06-30   Currency        0.00000000
2                 1        2014-06-30   Macro           50.00000000
3                 1        2014-06-30   Quantitative    10.00000000
4                 1        2014-06-30   Credit          90.00000000
  

Ниже то, что я пытаюсь закончить:

 PerfAttribAlphaID  ProductID   AsOfDate    AlphaSourceDesc   PerfAttribValue
1                 1        2014-06-30   Currency        0.00000000
2                 1        2014-06-30   Macro           50.00000000
3                 1        2014-06-30   Quantitative    10.00000000
4                 1        2014-06-30   Credit          90.00000000
  

Где PerfAttribAlphaID является первичным ключом (bigint) и увеличивается на единицу для каждой строки в таблице, ProductID и AsOfDate являются входными параметрами, AlphaSourceDesc — это Total, а PerfAttribValue — сумма всех предыдущих строк в таблице.

Комментарии:

1. Ваши «До» и «После» кажутся идентичными.

2. PerfAttribAlphaID ProductID AsOfDate AlphaSourceDesc PerfAttribValue 150.000000 5 1 2014-06-30 Всего Входные данные см. в тексте выше.

3. Я не могу придумать ни одной практической ситуации, когда это было бы хорошей идеей. Лучше всего вычислять итоговые данные во время запроса, а не пытаться сохранить их в базе данных. В противном случае вам нужно будет обновлять строку итогов каждый раз, когда вы вставляете, обновляете или удаляете строку.

4. как я могу записать это в хранимую процедуру, чтобы создать общую строку?

Ответ №1:

Вы не показываете свой запрос, поэтому я просто предполагаю здесь, но основная идея заключается в использовании union select :

перед:

 select PerfAttribAlphaID, ProductID, AsOfDate, AlphaSourceDesc, PerfAttribValue
from T
  

после:

 select PerfAttribAlphaID, ProductID, AsOfDate, AlphaSourceDesc, PerfAttribValue
from T
union 
select null, null, null,    'Total',   sum(PerfAttribValue)
from T
  

Ответ №2:

Вы можете использовать НАБОРЫ ГРУППИРОВОК для создания общей строки:

 select PerfAttribAlphaID, 
ProductID, 
AsOfDate, 
case when grouping(PerfAttribValue) = 1 then 'Total' else AlphaSourceDesc end AlphaSourceDesc,  
SUM(PerfAttribValue) PerfAttribValue
from MyTable
group by grouping sets((PerfAttribAlphaID, ProductID, AsOfDate, AlphaSourceDesc, PerfAttribValue), ())
  

Этот запрос может быть изменен, если у вас есть несколько идентификаторов продукта и вы хотите получить промежуточный итог для каждого из них. Этот SQL Fiddle демонстрирует это.