Avatar billede meganight Nybegynder
24. august 2009 - 13:08 Der er 5 kommentarer og
1 løsning

Split Data.

Jeg har et problem der har gået mig på i flere dage nu..
Jeg skal hente Data omkring studerende ud fra forskellige Tabeller, og sætte dem sammen pænt til noget Excel.
Mit problem ligger i at de studerende har flere Medvejledere, og de ligger i en Tabel, hvor man bruger userID til at finde ud af hvem har haft hvem.
Jeg kan fint hente en Vejleder ud, men de vil så gerne have de 3 første.

Jeg har leget lidt med RANK() Funktionen, men inden i "Selecten" kunne den ikke fange den userID der blev fundet udenfor.

Pt. Ser min Select sådan her ud, som henter den første vejleder ud.

SELECT DECODE(SUBSTR(C.userID, length(C.userID), length(C.userID)),
'0', 'Kvinde', '1', 'Mand', '2', 'Kvinde', '3', 'Mand', '4', 'Kvinde', '5', 'Mand',
'6', 'Kvinde', '7', 'Mand', '8', 'Kvinde', '9', 'Mand') as Kon,
C.NAVN1, C.NAVN2,
(Select E.NAVN1 from WEB_MEDVEJLEDER E Where C.userID = trim(both ' ' from E.userID) and rownum = 1) As Medvejlederfor1,
(Select E.NAVN2 from WEB_MEDVEJLEDER E Where C.userID = trim(both ' ' from E.userID) and rownum = 1) As Medvejlederefter1
FROM NAVNEOPL C, STUDIEOPL B, STUDIE A, PROGRAMUDVALG D
WHERE A.userID = B.userID AND B.userID = C.userID AND A.PROGRAM_KODE = D.PROGRAM_KODE

Meningen er jeg skal have de 3 første, som beskrevet på dette billede.
http://i105.photobucket.com/albums/m218/MegaNight2006/SqlHelp.jpg

Håber inderligt nogle vil give en hånd med her, jeg har kogt over det i for lang tid nu.
Avatar billede steber Nybegynder
25. august 2009 - 07:00 #1
Har jo ikke dine tabeller, så har leget med scott/tiger schemaet.
Betragt DEPT tabellen som din studerende tabel, og EMP tabellen som din vejleder tabel. D.v.s. der kan være flere EMP's til hver DEPT.
Forhåbentlig gør min opdeling det muligt at se ideen.
Du skal vide at Oracle 11g har fået en ny PIVOT feature, som jeg dog ikke er specielt begejstret for fordi den ikke er meget mere simpel at se på, mens den gammeldaws metode nedenfor virker på alle Oracle baser med windowing. Måske får jeg tid til at vise en tilsvarende SQL med PIVOT senere i dag.

-- 1. Få rækker ud:
SELECT dept.deptno, dept.dname,
      emp.empno, emp.ename
  FROM scott.emp,
      scott.dept
WHERE emp.deptno = dept.deptno
ORDER BY dept.deptno, emp.empno;

-- 2. Giv rækker en orden:
SELECT dept.deptno, dept.dname,
      emp.empno, emp.ename,
      row_number() OVER (PARTITION BY dept.deptno
                              ORDER BY emp.empno  ) sortno
  FROM scott.emp,
      scott.dept
WHERE emp.deptno = dept.deptno
ORDER BY dept.deptno, emp.empno;
-- Ja, window'et sorteres på emp.empno. Resultatet virker nærmest tilfældigt.
-- Måske kan du finde en bedre orden/sortering.

-- 3. Lav pivot. Del 1.
SELECT sub.deptno, sub.dname,
      CASE WHEN sortno = 1 THEN empno ELSE to_number( NULL) END empno1,
      CASE WHEN sortno = 1 THEN ename ELSE to_number( NULL) END ename1,
      CASE WHEN sortno = 2 THEN empno ELSE to_number( NULL) END empno2,
      CASE WHEN sortno = 2 THEN ename ELSE to_number( NULL) END ename2,
      CASE WHEN sortno = 3 THEN empno ELSE to_number( NULL) END empno3,
      CASE WHEN sortno = 3 THEN ename ELSE to_number( NULL) END ename3
  FROM (SELECT dept.deptno, dept.dname,
              emp.empno, emp.ename,
              row_number() OVER (PARTITION BY dept.deptno
                                      ORDER BY emp.empno  ) sortno
          FROM scott.emp,
              scott.dept
        WHERE emp.deptno = dept.deptno
        ) sub
ORDER BY sub.deptno;

-- 3. Lav pivot. Del 2.
SELECT sub.deptno, sub.dname,
      max( CASE WHEN sortno = 1 THEN empno ELSE to_number( NULL) END) empno1,
      max( CASE WHEN sortno = 1 THEN ename ELSE to_number( NULL) END) ename1,
      max( CASE WHEN sortno = 2 THEN empno ELSE to_number( NULL) END) empno2,
      max( CASE WHEN sortno = 2 THEN ename ELSE to_number( NULL) END) ename2,
      max( CASE WHEN sortno = 3 THEN empno ELSE to_number( NULL) END) empno3,
      max( CASE WHEN sortno = 3 THEN ename ELSE to_number( NULL) END) ename3
  FROM (SELECT dept.deptno, dept.dname,
              emp.empno, emp.ename,
              row_number() OVER (PARTITION BY dept.deptno
                                      ORDER BY emp.empno  ) sortno
          FROM scott.emp,
              scott.dept
        WHERE emp.deptno = dept.deptno
        ) sub
GROUP BY sub.deptno, sub.dname
ORDER BY sub.deptno;
Avatar billede steber Nybegynder
25. august 2009 - 09:08 #2
Her et eksempel på brug af den nye Oracle 11g PIVOT syntaks (hvis du har en 11g version), ikke meget mere simpel i dette tilfælde synes jeg. Men det er jo en smagssag.

SELECT *
  FROM (SELECT deptno, dname, sortno, empno, ename
          FROM (SELECT dept.deptno, dept.dname,
                      emp.empno, emp.ename,
                      row_number() OVER (PARTITION BY dept.deptno
                                              ORDER BY emp.empno  ) sortno
                  FROM scott.emp,
                      scott.dept
                WHERE emp.deptno = dept.deptno))
PIVOT (max(empno) AS empno,
        max(ename) AS ename FOR (sortno) IN (1 AS a, 2 AS b, 3 AS c))
ORDER BY deptno;
Avatar billede meganight Nybegynder
25. august 2009 - 10:32 #3
Steber det ser alt sammen smukt ud..
Men vores servere køre med Oracle 9, og det er out of the question at opdatere den desværre...

Har du en løsning der kan fungere under Oracle 9 forhold?
Avatar billede steber Nybegynder
25. august 2009 - 10:45 #4
Ja, det gik måske lidt tabt i alt det jeg skrev ... bare glem mit sidste eks. med Oracle 11g og PIVOT. Brug mit første svar (3. Lav pivot. Del 2.)
Avatar billede meganight Nybegynder
25. august 2009 - 11:40 #5
Mange tak, jeg kigger på det og vender tilbage.
Avatar billede meganight Nybegynder
25. august 2009 - 14:19 #6
Det fungere helt perfekt..
Jeg takker af hele mit hjerte.
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