Select sum(string field) ....

8 отговора 859 прегледа
#1

Select sum(string field) ....

Знае ли някой как да "сумирам" стрингово поле ?
Например в таблица имам следното :

1 софия
2 варна
1 русе

заявката трябва да върне

1 софия русе
2 варна

базата е Firebird 1.5.2
Знам, че в Yaffil има такава ф-я - LIST(string field), но не ми се сменя сървъра.

Отговор
в отговор на val63 #2

Re: Select sum(string field) ....

Съхранена процедура
Напр. ако имаш
CREATE TABLE T1 (

ID INTEGER,
STRINGFIELD VARCHAR(1024)
);

INSERT INTO T1 (ID, STRINGFIELD) VALUES (1, 'софия ');
INSERT INTO T1 (ID, STRINGFIELD) VALUES (2, 'варна ');
INSERT INTO T1 (ID, STRINGFIELD) VALUES (1, 'русе ');

CREATE PROCEDURE LIST
RETURNS (
ID INTEGER,
STRINGFIELD VARCHAR(1024))
AS
DECLARE VARIABLE TMP VARCHAR(1024);
begin
/* Procedure Text */
For select distinct ID from T1 into :ID
do begin
STRINGFIELD='';
FOR select STRINGFIELD from T1 where ID=:ID into :TMP
do STRINGFIELD=:TMP||' '||:STRINGFIELD;
suspend;
end
end
^

При select * from LIST ще получиш

ID STRINGFIELD
1 русе софия
2 варна


Отговор
в отговор на val63 #3

Re: Дано да не се приеме като заяждане

В MySQL има агрегатна функция за целта

GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])

salle.online.bg/sig

Редактирано от salle на

Отговор
в отговор на NDeu #4

Re: Select sum(string field) ....

Благодаря !
В момента го правя с една постоянна и една memory table, която зареждам програмно и после използувам за lookup поле.
Понеже таблиците са малки и се инсертва/ъпдейтва паралелно в двете, не се забелязва разлика в бързодействието в сравнение със stored procedurata, дори с memory table e малко по-бързичко.
Предполагам, че за големи таблици със stored procedurata ще е доста по-добре.

Отговор
в отговор на salle #5

Re: Дано да не се приеме като заяждане

salle,ако не е проблем може ли да напишеш цялата заявка за да видя как става?
Мерси предварително!

Отговор
в отговор на Martinnnnnn #6

Re: Ети ти един пример с примерната БД World

mysql> SELECT c1.Name, GROUP_CONCAT(c2.Name) AS City_List FROM Country AS c1, City AS c2 WHERE c1.Code=c2.CountryCode AND c1.Name LIKE 'Bu%' GROUP BY c1.Code LIMIT 10;
+--------------+---------------------------------------------------------------------+
| Name | City_List |
+--------------+---------------------------------------------------------------------+
| Burundi | Bujumbura |
| Burkina Faso | Ouagadougou,Bobo-Dioulasso,Koudougou |
| Bulgaria | Sofija,Plovdiv,Varna,Burgas,Ruse,Stara Zagora,Pleven,Sliven,Dobric, |
+--------------+---------------------------------------------------------------------+



mysql> SELECT c1.Name, GROUP_CONCAT(c2.Name ORDER BY c2.Name SEPARATOR '; ') AS City_List FROM Country AS c1, City AS c2 WHERE c1.Code=c2.CountryCode AND c1.Name LIKE 'Bu%' GROUP BY c1.Code LIMIT 10;
+--------------+----------------------------------------------------------------------------+
| Name | City_List |
+--------------+----------------------------------------------------------------------------+
| Burundi | Bujumbura |
| Burkina Faso | Bobo-Dioulasso; Koudougou; Ouagadougou |
| Bulgaria | Burgas; Dobric; Pleven; Plovdiv; Ruse; Sliven; Sofija; Stara Zagora; Varna |
+--------------+----------------------------------------------------------------------------+


salle.online.bg/sig

Редактирано от salle на

Отговор
в отговор на salle #7

Re: Ети ти един пример с примерната БД World

хехехе :) офф топик, ма как па точно тея градове фана баси :)

искам да живея в оуагадоугоу, може и в бужумбура де :)

Отговор
в отговор на тoшo #8

Re: Ами случайно :)

Когато бях ученик Уагадугу ми беше една от любимите столици на картата на света.

Тогава обаче държавата се казваше Горна Волта.

salle.online.bg/sig
Отговор
в отговор на salle #9

Re: Между другото ...

Навремето като я добавхмe тази функция аз поддържах идеята, че за разделител по подразбиране трябва да се използва интервал. Обаче се оказах малцинство.

Доколкото помня всички бяха единодушни, че без ORDER BY клаузата е подобна функция е доста безсмислена.

salle.online.bg/sig
Отговор