Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамическая группировка в MSSQL [D5, MSSQL]


Vick ©   (2003-10-06 17:44:00) 

Добого всем дня!!!
Есть такая ситуация: нужно для определенных наборов данных делать группировку в зависимости от того, какие поля для группирования выбрал пользователь. Пишу процедуру, в которой выбираемые поля и поля группировки передаю как параметры через запятую в виде строки. В результате в процедуре у меня получается такой текст:

set @S = "select " + @selFields + "from table1 " +
"group by " + @groupFields


Группировка присходит отлично, все работает как часы. Но тут нашей доблестной бухгалерии приспичило, чтобы при этом еще к каждой группе итоговые суммы выводились. Как мне отговорить их от этой идеи?? Или может у кого свежая мысля возникнет по поводу концепции группировки???


paul_k   (2003-10-07 15:11:00) [1]

2 ЮЮ
А что делать.. вот приходится изголятся и хуже. select из таблиц юзерам закрыт. только процедуру исполнить могут...


Polevi   (2003-10-07 13:54:00) [2]

будет 2 датасета, если тебя это не пугает - ok


Vick   (2003-10-07 13:20:00) [3]

Короче, народ, все оказывается делается как 2 пальца об асфальт!!! Просто пишется в запросе:

set @S = "select " + @selFields + "from table1 " +
"group by " + @groupFields + " with Rollup "


и SQL сам добавляет в порядке иерархии все итоговые суммы!!!
ВО КАК!!!


Polevi   (2003-10-07 10:16:00) [4]

>Vick © (06.10.03 17:56) [2]
у меня все складывается


ЮЮ   (2003-10-07 02:21:00) [5]

Вот если не использовать процедуру только ради процедуры (а другой надобности в этом не вижу, т.к. selFields и groupFields не параметры, а макросы), то можно было бы динамически сформировать запрос и на клиенте, используя всю мощь Pascal-я.


Ломброзо Цезарь   (2003-10-06 23:08:00) [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.


paul_k   (2003-10-06 18:16:00) [7]

но при этом прекрасно работает exec(@S1+@S2+...)


Vick   (2003-10-06 18:15:00) [8]

>paul_k

Есть одни грабли - в MSSQL varchar имеет длину 8000, а полей для группировки у меня может быть и 20, зачит итоговых сумм будет на 1 меньше. Какой длины строчечка получиться??? ;)))))


paul_k   (2003-10-06 18:06:00) [9]

a set @S = @S+ "union select "+@SumFIelds+"from ("+@s+")"
где @SumFIelds - строка вида sum(Field1),sum(Field2),.... если
@selFields у тебя Field1,Field2,....
вместо sum(field) если поле нечисловое - null поставить


Vick   (2003-10-06 17:56:00) [10]

>Polevi
А если несколько полей для группировки, каким образом я буду итоги считать на клиенте, построчечно складывать?


Polevi   (2003-10-06 17:48:00) [11]

правильно приспичило, на клиенте считай итоги


Наверх

Титульная страница Поиск, карта сайта Написать письмо