Форум: "Базы";
Текущий архив: 2003.10.27;
Скачать: [xml.tar.bz2];
ВнизДинамическая группировка в MSSQL Найти похожие ветки
← →
Vick (2003-10-06 17:44) [0]Добого всем дня!!!
Есть такая ситуация: нужно для определенных наборов данных делать группировку в зависимости от того, какие поля для группирования выбрал пользователь. Пишу процедуру, в которой выбираемые поля и поля группировки передаю как параметры через запятую в виде строки. В результате в процедуре у меня получается такой текст:
set @S = "select " + @selFields + "from table1 " +
"group by " + @groupFields
Группировка присходит отлично, все работает как часы. Но тут нашей доблестной бухгалерии приспичило, чтобы при этом еще к каждой группе итоговые суммы выводились. Как мне отговорить их от этой идеи?? Или может у кого свежая мысля возникнет по поводу концепции группировки???
← →
Polevi (2003-10-06 17:48) [1]правильно приспичило, на клиенте считай итоги
← →
Vick (2003-10-06 17:56) [2]>Polevi
А если несколько полей для группировки, каким образом я буду итоги считать на клиенте, построчечно складывать?
← →
paul_k (2003-10-06 18:06) [3]a set @S = @S+ "union select "+@SumFIelds+"from ("+@s+")"
где @SumFIelds - строка вида sum(Field1),sum(Field2),.... если
@selFields у тебя Field1,Field2,....
вместо sum(field) если поле нечисловое - null поставить
← →
Vick (2003-10-06 18:15) [4]>paul_k
Есть одни грабли - в MSSQL varchar имеет длину 8000, а полей для группировки у меня может быть и 20, зачит итоговых сумм будет на 1 меньше. Какой длины строчечка получиться??? ;)))))
← →
paul_k (2003-10-06 18:16) [5]но при этом прекрасно работает exec(@S1+@S2+...)
← →
Ломброзо Цезарь (2003-10-06 23:08) [6]В MSSQL есть очень удобный способ, см. FOR XML AUTO в Books Online. Если владеешь XML + XSL, а отчет не требует обновления (просто на печать), то можно сделать ХП, в которой запросы следуют через точку с запятой, например
----------------------------------
create procedure sp_PaymentsXML(@auto_id uniqueidentifier) as
begin
select * from FWViewAutos where auto_id = @auto_id for xml auto;
select * from PaymentsExpenses where type = "in" and auto_id = @auto_id order by data for xml auto;
select * from PaymentsExpenses where type = "out" and auto_id = @auto_id order by data for xml auto;
...
end
----------------------------------
Запросы могут быть произвольного вида. В итоге формируется составной XML документ, который отдается в ADODB::Stream. Этот XML спаривается с XSL, получается HTML, который красиво выводится в броузер. Или парсится VB-скриптом и выводится в Word.
← →
ЮЮ (2003-10-07 02:21) [7]Вот если не использовать процедуру только ради процедуры (а другой надобности в этом не вижу, т.к. selFields и groupFields не параметры, а макросы), то можно было бы динамически сформировать запрос и на клиенте, используя всю мощь Pascal-я.
← →
Polevi (2003-10-07 10:16) [8]>Vick © (06.10.03 17:56) [2]
у меня все складывается
← →
Vick (2003-10-07 13:20) [9]Короче, народ, все оказывается делается как 2 пальца об асфальт!!! Просто пишется в запросе:
set @S = "select " + @selFields + "from table1 " +
"group by " + @groupFields + " with Rollup "
и SQL сам добавляет в порядке иерархии все итоговые суммы!!!
ВО КАК!!!
← →
Polevi (2003-10-07 13:54) [10]будет 2 датасета, если тебя это не пугает - ok
← →
paul_k (2003-10-07 15:11) [11]2 ЮЮ
А что делать.. вот приходится изголятся и хуже. select из таблиц юзерам закрыт. только процедуру исполнить могут...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.10.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c