Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
6-89414
DNT
2003-09-01 12:03
2003.10.27
Помогите начать


1-89286
TUser
2003-10-14 12:36
2003.10.27
Убрать Hint


1-89230
Modus
2003-10-15 10:34
2003.10.27
Начать новую страницу при печати


1-89335
killer
2003-10-16 12:52
2003.10.27
PopupMenu


4-89656
Aleksei K
2003-08-20 11:06
2003.10.27
VCL формы из DLL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский