Avatar billede kamak Praktikant
04. november 2009 - 14:11 Der er 8 kommentarer og
1 løsning

SQL hvor en kolonne bliver til komma-seperaret række

Hvis jeg har en tabel der ser sådan ud:

TABEL
ID; NAVN1; NAVN2;
1; test1; anders;
2; test1; bjarne,
3; test2; christian;
4; test2; dorte;
5; test2; emil;
(3 kolonner, 5 rækker)

Hvordan skal min SQL så se ud hvis jeg ønsker følgende resultat:

test1; anders, bjarne;
test2; christian, dorte, emil;
(2 kolonner, 2 rækker)

Jeg ønsker altså 2 kolonner og at der skal være lige så mange rækker som der er entydige elementer i kolonne NAVN1 samt at den sidste kolonne indeholder en komma seperaret liste med de tilhørende elementer i NAVN2.

Jeg håber i forstår :-)
04. november 2009 - 17:20 #1
Om du kan faa det oenskede format direkte som resultat af et SQL query det ved jeg ikke.  SQL queryen's job er normalt at skaffe dataerne, og hvis de skal vises i et specielt format er det applikationen's opgave.

Jeg lavede en mysql tabel ved navn kamak med den struktur og data du angiver og et php script der traekker dataerne ud og giver det oenskede format.  Scriptet bruger foerst en mysql query for alle NAVN1 (i dit eksempel test1 og test2) og putter dem i en array.  Dernaest laver scriptet for hver NAVN1 en mysql query for de paagaeldende NAVN2 og skriver saa resultatet ud som du oenskede.  Nedenstaaende script gav dette resultat:

test1; anders, bjarne
test2; christian, dorte, emil

Du kan checke paa det paa http://christianjorgensen.be/kamak.php.

Jeg haaber det hjaelper.

<?
  $link = mysql_connect ('christianjorgensen.be.mysql', 'christianjoygen', 'dnyBKKbe') or die(mysql_erorr());
  mysql_select_db('christianjoygen') or die('Could not select database');
  //Foerst mysql query for alle vaerdier af NAVN1 og placere dem i array $navn1.
  $result = mysql_query("SELECT NAVN1 FROM kamak GROUP BY NAVN1") or die(mysql_error());
  //Derefter, for hver vaerdi af NAVN1 en mysql query for de tilsvarende NAVN2 vaerdier
  while($row = mysql_fetch_array($result)) $navn1[] = $row[0];
  for($i=0; $i<count($navn1); $i++)
  {
    $result = mysql_query("SELECT NAVN2 FROM kamak WHERE NAVN1 = '$navn1[$i]' ORDER BY NAVN2") or die(mysql_error());
    //placere NAVN2 vaerdierne i array $navn2
    while($row = mysql_fetch_array($result))
    {
      $navn2[] = $row[0];
    }
    //og skriv NAVN1 plus en komma liste med dets NAVN2 vaerder
    echo $navn1[$i] . "; " . implode(", ",$navn2) . "<br/>";
    unset($navn2);
  }
  mysql_close($link);
?>
Avatar billede janus_007 Nybegynder
04. november 2009 - 18:30 #2
Det er nu ikke så svært igen...

Du skal blot lave en funktion:

alter function fnConcatenate(@f varchar(5))
returns varchar(50)
as
begin
    declare @sql varchar(255)
    select @sql = ISNULL(@sql, '') + NAVN2 from TABEL
        where f1 = @f
    return @sql
end

Og så kalde den sådan her:

select NAVN1, MIN(dbo.fnConcatenate(NAVN1))  from TABEL
group by NAVN
Avatar billede janus_007 Nybegynder
04. november 2009 - 18:30 #3
hovsa....
husk at rette :
select @sql = ISNULL(@sql, '') + NAVN2 from TABEL
        where f1 = @f

til

select @sql = ISNULL(@sql, '') + NAVN2 from TABEL
        where NAVN1 = @f
Avatar billede kamak Praktikant
05. november 2009 - 11:02 #4
Tak for svar til jer begge.
janus_007 dit svar er lige i bullseye. Det virker præcis som ønsket :-)
Avatar billede kamak Praktikant
05. november 2009 - 11:03 #5
Hvis du laver et svar får du pointene
Avatar billede janus_007 Nybegynder
05. november 2009 - 11:36 #6
Godt du kunne bruge det :)
09. november 2009 - 21:22 #7
Kamak, er tiden maaske inde til at lukke spoergsmaalet?  Det giver god orden, og saa staar spoergsmaalet ikke laengere som aabent i min liste af indlaeg.  Jeg skal ingen point have.  Jeg troede jeg havde et svar paa dit spoergsmaal, men Janus's svar er kendeligt bedre.
Avatar billede kamak Praktikant
24. august 2012 - 16:07 #8
I oracle kan man gøre sådan:

Base Data:

    DEPTNO ENAME
---------- ----------
        20 SMITH
        30 ALLEN
        30 WARD
        20 JONES
        30 MARTIN
        30 BLAKE
        10 CLARK
        20 SCOTT
        10 KING
        30 TURNER
        20 ADAMS
        30 JAMES
        20 FORD
        10 MILLER

Desired Output:

    DEPTNO EMPLOYEES
---------- --------------------------------------------------
        10 CLARK,KING,MILLER
        20 SMITH,FORD,ADAMS,SCOTT,JONES
        30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARDSELECT deptno,

LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees
FROM  emp
GROUP BY deptno;

    DEPTNO EMPLOYEES
---------- --------------------------------------------------
        10 CLARK,KING,MILLER
        20 ADAMS,FORD,JONES,SCOTT,SMITH
        30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
Avatar billede kamak Praktikant
24. august 2012 - 16:08 #9
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