Avatar billede xixdia Nybegynder
22. juni 2005 - 10:46 Der er 13 kommentarer

Group by text

Kan man ved et ODBC kald "summere" et textfelt med group by?

felt1  felt2  felt3
VareA  1      Hej med
VareA  2      dig

Resultat:
VareA  Hej med dig
Avatar billede -thomas- Nybegynder
22. juni 2005 - 10:51 #1
Ikke så vidt jeg ved. Der findes ingen aggregerings-funktioner til tekst i sql. Du kan vel også bare sætte det sammen i koden efterfølgende?

Hvis det kun er to felter, kan det vel gøres med en subquery / nested sql.
Avatar billede fennec Nybegynder
22. juni 2005 - 10:59 #2
Du kan godt samle felterne:
select felt1+' '+ felt2 +' '+ felt3 from entabel

Hvis en af felterne inderholder NULL bliver hele resultatet NULL da den ikke kan lægge dem sammen. Måske kan der gøres noget med cast eller convert hvis du har NULL værdier.
Avatar billede -thomas- Nybegynder
22. juni 2005 - 16:20 #3
fennec> Men det nytter jo ikke noget i en GROUP BY - han ville vel noget lign.:

SELECT SUM(felt3) FROM tabel GROUP BY VareA

(hvilket man ikke kan, hvis felt3 er et tekst-felt)
Avatar billede -thomas- Nybegynder
22. juni 2005 - 16:21 #4
Ups, SELECT SUM(felt3) FROM tabel GROUP BY felt1 selvfølgelig...
Avatar billede fennec Nybegynder
23. juni 2005 - 11:25 #5
-thomas- >>
Så er jeg med. Havde ikke forståret ? rigtigt :o)
Også har du ganske ret i at det ikke kan lade sig gøre...
Avatar billede -thomas- Nybegynder
23. juni 2005 - 12:06 #6
Godt så er vi enige :-)

Du kan godt gøre det, hvis du f.eks. ved at der altid er max tre rækker med samme felt1-værdi. Så burde det kunne løses med en række subqueries og noget streng-konkatenering.
Avatar billede venne Nybegynder
24. juni 2005 - 09:21 #7
Hvis du kan leve med at det er mere end et statement kan du bruge:

DECLARE @tekst varchar(1000)

SELECT @tekst = COALESCE(@tekst + ' ', '') + felt3
FROM tabel
WHERE felt1 = 'VareA'
ORDER BY felt2

SELECT @tekst


Princippet er at bruge "SELECT @tekst = @tekst + felt". Det fungerer faktisk som et loop inde i en SELECT.

Det hele burde kunne fyres af som én forespørgsel fra dit program. Alternativt kunne du lave det i en procedure.
Avatar billede renepedersen Nybegynder
24. juni 2005 - 10:15 #8
Det ser ud til du har en index værdi i felt 2. Hvis du kun har et par (2-3) records der skal sammensættes, kan du bare gøre følgende (Jeg antager her der er netop 3 records pr. felt1):

SELECT
felt1,(A.felt3+' '+B.felt3+' '+C.felt3) AS myresult
FROM
mytable A LEFT JOIN mytable B ON A.felt1=B.felt1 LEFT JOIN mytable C ON A.felt1=C.felt1
WHERE
A.felt2 = 1 AND B.felt2 = 2 AND C.felt2 = 3

Hvis du har et variabelt antal tekstlinjer (>3) pr. vare er det nok bedst at pakke det ind i en stored procedure, der bygger teksten op i en løkke, hvor du for hver felt1 - i rækkefølgen felt2 concatenerer felt3 til en resultatstreng. Bruger du en procedure er du heller ikke begrænset af et bestemt antal linjer.
Avatar billede xixdia Nybegynder
01. juli 2005 - 14:59 #9
Der kan være mellem 1 og 20+ linier, der er ikke noget fast antal.
Avatar billede xixdia Nybegynder
04. juli 2005 - 10:19 #10
Venne> Jeg får flg fejl:
"Navnet @tekst er ikke tilladt"
Avatar billede venne Nybegynder
04. juli 2005 - 12:48 #11
Hvad prøver du at lave? Hvilket værktøj bruger du? Hvordan ser koden ud?

Den blok jeg viste kan køre i Query Analyzer som én forespørgsel, men fra et program skal det muligvis ændres lidt.
Avatar billede xixdia Nybegynder
04. juli 2005 - 13:26 #12
Bruger MS-query fra excel, har brugt din kode med rettede feltnavne
Avatar billede venne Nybegynder
06. juli 2005 - 09:29 #13
Excel og Query er ikke min stærke side, men jeg prøvede lige at sætte min forespørgsel índ i Query og det virkede godt nok for mig. Men det giver jo kun teksten for én vare og du vil sikkert gerne have flere, dynamisk efter hvor mange varer der er osv. Det bedste jeg lige kan komme på er en stored procedure, der returnerer alle varer med den samlede tekst, men jeg ved jo ikke om det er det du vil have.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester