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

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

Аггрегатные функции для строковых величин [D5, MSSQL]


Страницы:   1 2

Vick ©   (2003-12-26 11:45:00) 

Доброго всем дня.

Помню был в форуме такой вопрос, не могу найти: в общем есть табличка вида

NAME PRICE
-------------
aa 10
vv 52
cc 12
dd 25


Нужно построить аггрегатный запрос таким образом чтобы в результате получилось:

NAME PRICE
------------------------
aa, vv, cc, dd 99


Sandman25   (2003-12-26 16:00:00) [1]

[26] Курков Михаил (26.12.03 15:14)

Обалдеть...


Vick   (2003-12-26 15:39:00) [2]


> Курков Михаил


Спасибо!!!!!!


just me   (2003-12-26 15:34:00) [3]

Пример функции для "сбора" строки NAME:
CREATE FUNCTION lr_GetNAMEs ()
RETURNS varchar(8000)
AS
BEGIN
DECLARE @names varchar(8000)
SET @names = ""
-- no cursor!!!
SELECT @names =
CASE @names
WHEN "" THEN ISNULL(RTRIM(LTRIM(NAME)), "")
ELSE @names + ", " + ISNULL(RTRIM(LTRIM(NAME)), "")
END
FROM Table -- WHERE <some criteria>
RETURN(@names)
END


Курков Михаил   (2003-12-26 15:14:00) [4]

Если есть таблица
T (Name, Month, Price) и при этом известно, какие значения могут быть в Month результат можно получить так:

select
Name,
MonthSum =
max(case when Month = "Янв" then "Янв," end) +
max(case when Month = "Фев" then "Фев," end) +
max(case when Month = "Мар" then "Мар," end) +
... ,
sum(Price)
from
T
group by
Name


paul_k   (2003-12-26 13:34:00) [5]

проставить номер месяца и его "вес" в строке.
после суммирования sum(mons_no*str_pos)
получим число. при выдаче наружу в строку его и разобрать строку.
примерно так
declare @mons_sum numeric(18,0),
@mons_sum_str varchar(18)
set @mons_sum=1000000000000000+1+2*10+3*100+4*1000+5*10000+6*100000+7*1000000+8*10000000+9*100000000+convert(numeric,10)*100 0000000+convert(numeric,11)*100000000000+convert(numeric,12)*10000000000000
select @mons_sum
set @mons_sum_str=Ltrim(rtrim(convert(varchar,@mons_sum)))
select case
when SUBSTRING(@mons_sum_str, 16,1)<>"0" then "январь, "
end +
case
when SUBSTRING(@mons_sum_str, 15,1)<>"0" then "февраль, "
end +
case
when SUBSTRING(@mons_sum_str, 14,1)<>"0" then "Март, "
end +
case
when SUBSTRING(@mons_sum_str, 13,1)<>"0" then "Апрель, "
end +
case
when SUBSTRING(@mons_sum_str, 12,1)<>"0" then "Май, "
end


paul_k   (2003-12-26 13:27:00) [6]

Геморойную не надо. есть идея ша проверю и кину


Vick   (2003-12-26 13:11:00) [7]


> LordOfSilence ©


Дык дети от Святого Духа тож не появляются, тут уж мужиков никто не заменит :))) А задачу пока все равно решить нужно!!!

Я так поняла нужно писать геморойную процедуру.


LordOfSilence   (2003-12-26 13:08:00) [8]

2 Vick © (26.12.03 13:02) [19]
Вот!!! А вот это уже правильная мысль! :-)))
Двигайся в этом направлении. Мужиков-программистов - как собак
нерезанных, тебя всегда смогут подменить. :)))
А родить человека сможет только женщина, так что не теряй времени. ;-)


Vick   (2003-12-26 13:05:00) [9]


> paul_k ©


FastReport. Но эти данные выводятся исключительно только в грид.


paul_k   (2003-12-26 13:03:00) [10]

2 Vik
так в чем ты отчеты рисуеш?


Vick   (2003-12-26 13:02:00) [11]


> paul_k ©


твои слова да Богу в ухи!!!!! Но я всего один программер в организации и посему мне тут этого не видать!!! Эх, пора в декретный отпуск!!!!


paul_k   (2003-12-26 12:56:00) [12]

2 Vik
а как славно если между тобой и "заказчиком" сидит грамотный постановщик с правами послать заказчика с такими хотелками в лес.
но это, увы, лишь мечты


LordOfSilence   (2003-12-26 12:56:00) [13]

2 Vick © (26.12.03 12:52) [16]
Не шуми, эти люди тебе зарплату начисляют ;-)


Vick   (2003-12-26 12:52:00) [14]

Как хорошо работать с финансовым отделом, они такие замечательные постановки делают, не то что бухгалтерия!!!!!


LordOfSilence   (2003-12-26 12:46:00) [15]

Сегодня предновогодняя тяпница, день по определению флеймовый.
А я и есть маленький. Ну что ты хочешь? 168 см. росту во мне ;-)

Слушай, вот эти твои "янв., фев., мар." по сути есть кварталы.
А по кварталам в MSSQL сгруппировать можно. Может поможет?

В Books Online посмотри по ключевому слову Pivot.
Лично я так не делал, так как занимаюсь OLAP-анализом,
поэтому эти ухищрения непосредственно в MSSQL мне безо
всякой надобности, сама понимаешь.


paul_k   (2003-12-26 12:45:00) [16]

2 Vick
ну вот.. очередной урок телепатии надо брать...
1. в том виде как задан вопрос ответ единственный - уволить постановщика.
2 вот Vick © (26.12.03 12:35) [10]уже вносит ясность, но так как посавлен вопрос ты получиш запись в отчете вида

ORG NAME PRICE
-----------------------------------------
МММ янв., фев., фев. ... 450
ДДД янв., фев., мар. 752
ссс мар., апр. 345

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


Term   (2003-12-26 12:42:00) [17]

хранимая процедура однозначно, и мучиться не надо


Vick   (2003-12-26 12:38:00) [18]


> paul_k ©


А мне постановку не бухгалтерия делает, а зам. ген. директора по информационыым технологиям - мой начальник!!!!


Sandman25   (2003-12-26 12:38:00) [19]

[10] Vick © (26.12.03 12:35)

Так это же совершенно другое дело - тут есть принципиальное ограничение на 12 записей.


Vick   (2003-12-26 12:35:00) [20]


> LordOfSilence ©


Леш, ну ты как маленький :)))) Пора бы уже не удивляться моим вопросам.
На самом деле я под NAME подразумевала месяц, а под PRICE сумму оплаты. Предположим, что есть еще одно поле ORG - организация.
То хотелось бы, чтобы результат запроса имел такой вид, сгруппированный по ORG:

ORG NAME PRICE
-----------------------------------------
МММ янв., фев. 450
ДДД янв., фев., мар. 752
ссс мар., апр. 345


Страницы:   1 2

Наверх

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