#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 демонстрирует это.