|
| Select på ikke-eksisterende værdier Fra : Tomas Christiansen |
Dato : 08-12-03 11:56 |
|
Jeg er kørt lidt død i et lille problem - det drejer sig om en Oracle 8.1.6
database.
Der findes nogle koder: A og B i databasen og de findes i varianterne 1, 2
og 2. Ud for hver variant står antallet.
Rækkerne ser således ud (kode - var - antal) i tabellen tx:
A - 1 - 26
A - 2 - 3
A - 3 - 95
B - 1 - 1
B - 3 - 6
Jeg ønsker at ende med en opsummering som skal se nogenlunde således ud:
Kode - Var1 - Var2 - Var3 - Sum
A - 26 - 3 - 95 - 124
B - 1 - 0 - 6 - 7
Nu er mit problem at variant 2 af kode B _ikke_ findes blandt rækkerne, og
derfor skal antallet opfattes som 0, men det giver mig problemer, hvis jeg
forsøger at selecte f.eks. i denne retning:
SELECT t1.kode, t1.antal AS var1, t2.antal AS var2, t3.antal AS var3,
t1.antal+t2.antal+t3.antal
FROM tx t1, tx t2, tx t3
WHERE t1.kode=t2.kode
and t2.kode=t3.kode
and t1.var=1
and t2.var=2
and t3.var=3
ORDER BY t1.kode;
Problemet er at kode B slet ikke bliver medtaget, idet t2.var=2 ikke bliver
opfyldt når kode='B', og derfor kommer hele B-rækken ikke med i mit output.
Hvordan løser jeg problemet UDEN at skulle indsætte de "manglende" 0-poster
i tabellen tx?
-------
Tomas
| |
Jan Bachman (08-12-2003)
| Kommentar Fra : Jan Bachman |
Dato : 08-12-03 23:37 |
|
>Jeg er kørt lidt død i et lille problem - det drejer sig om en Oracle 8.1.6
>database.
>
>Der findes nogle koder: A og B i databasen og de findes i varianterne 1, 2
>og 2. Ud for hver variant står antallet.
>Rækkerne ser således ud (kode - var - antal) i tabellen tx:
> A - 1 - 26
> A - 2 - 3
> A - 3 - 95
> B - 1 - 1
> B - 3 - 6
>
>Jeg ønsker at ende med en opsummering som skal se nogenlunde således ud:
>
> Kode - Var1 - Var2 - Var3 - Sum
> A - 26 - 3 - 95 - 124
> B - 1 - 0 - 6 - 7
Hvad med lidt krydstabulering?
TRANSFORM SUM(tabelnavn.antal) AS sumantal
SELECT tabelnavn.kode
FROM tabelnavn
GROUP BY tabelnavn.kode
PIVOT tabelnavn.var;
/Jan
| |
Jan Bachman (08-12-2003)
| Kommentar Fra : Jan Bachman |
Dato : 08-12-03 23:40 |
|
>> Kode - Var1 - Var2 - Var3 - Sum
>> A - 26 - 3 - 95 - 124
>> B - 1 - 0 - 6 - 7
>
>Hvad med lidt krydstabulering?
Oi... jeg fik ikke læst dit ønske godt nok. Glem krydstabulering, som
jeg fremlagde det.
/Jan
| |
Tomas Christiansen (09-12-2003)
| Kommentar Fra : Tomas Christiansen |
Dato : 09-12-03 00:30 |
|
Jan Bachman skrev:
> >Hvad med lidt krydstabulering?
>
> Oi... jeg fik ikke læst dit ønske godt nok. Glem krydstabulering, som
> jeg fremlagde det.
OK. Det irriterer mig en del, at jeg synes at jeg engang fik løst et
tilsvarende problem, men jeg kan ikke huske liiiiige hvordan.
Sagen står i øvrigt sådan lige nu, at jeg har fundet så mange andre småfejl
i det pågældende system, at hele systemet skal tages op til revurdering. Jeg
har rent faktisk PT. løst mit problem i noget eksekverbar kode i stedet for
i SQL, men er stadig interesseret i den rent akademiske situation - hvad
løser man den slags problemer?
-------
Tomas
| |
Jan Bachman (09-12-2003)
| Kommentar Fra : Jan Bachman |
Dato : 09-12-03 01:09 |
|
>Sagen står i øvrigt sådan lige nu, at jeg har fundet så mange andre småfejl
>i det pågældende system, at hele systemet skal tages op til revurdering. Jeg
>har rent faktisk PT. løst mit problem i noget eksekverbar kode i stedet for
>i SQL, men er stadig interesseret i den rent akademiske situation - hvad
>løser man den slags problemer?
Her følger lidt hjernespind. Jeg har udtrykt mine nestede
SQL-sætninger separat. Det hele skal substitueres sammen til sidst.
Håber det giver mening
Vi starter med at opbygge alle mulige kombinationer af "kode" og
"var".
nest1:
SELECT DISTINCT tabel.kode FROM tabel;
nest2:
SELECT DISTINCT tabel.var FROM tabel;
nest3:
SELECT nest1.kode, nest2.var
FROM nest1, nest2;
Herefter kan du right joine for at forbinde de tænkelige kombinationer
med de eksisterende.
nest4:
SELECT nest3.kode, nest3.var, tabel.antal
FROM tabel
RIGHT JOIN nest3
ON (tabel.kode = nest3.kode) AND (tabel.var = nest3.var);
Dette kan du så krydstabulere:
TRANSFORM nest4.antal
SELECT nest4.kode
FROM nest4
GROUP BY nest4.kode
PIVOT nest4.var;
Du kan evt. manupulere "antal", så du får 0'er i stedet for NULL, de
steder hvor der er huller.
TRANSFORM Sum(Nz(nest4.antal, 0)) AS manipuleretantal
Summen for hver "kode" kan evt. klares i frontend.
Alternativt kan det beregnes separat og føjes til med en UNION, inden
der køres TRANSFORM.
/Jan
| |
Jan Bachman (09-12-2003)
| Kommentar Fra : Jan Bachman |
Dato : 09-12-03 01:15 |
|
>Dette kan du så krydstabulere:
>
>TRANSFORM nest4.antal
Jaja, småfejl slipper vi nok aldrig for =o)
TRANSFORM Sum(nest4.antal) As sumantal
/Jan
| |
Thomas Rokamp (10-12-2003)
| Kommentar Fra : Thomas Rokamp |
Dato : 10-12-03 16:41 |
|
> Herefter kan du right joine for at forbinde de tænkelige kombinationer
> med de eksisterende.
> Dette kan du så krydstabulere:
> Summen for hver "kode" kan evt. klares i frontend.
> Alternativt kan det beregnes separat og føjes til med en UNION, inden
> der køres TRANSFORM.
Hvor finder man læsestof der forklarer alle disse begreber? Jeg syntes jeg
kan huske noget fra skoletiden, men det ilgger godt nok lidt fjernt...
Mvh.
Thomas Rokamp
| |
Jan Bachman (10-12-2003)
| Kommentar Fra : Jan Bachman |
Dato : 10-12-03 18:14 |
|
>Hvor finder man læsestof der forklarer alle disse begreber? Jeg syntes jeg
>kan huske noget fra skoletiden, men det ilgger godt nok lidt fjernt...
Jeg allierer mig tit med MS Access, der har et udmærket interface til
opbygning af SQL-strenge, samt hjælp til samme.
/Jan
| |
Troels Arvin (10-12-2003)
| Kommentar Fra : Troels Arvin |
Dato : 10-12-03 20:12 |
|
On Wed, 10 Dec 2003 18:14:05 +0100, Jan Bachman wrote:
>>Hvor finder man læsestof der forklarer alle disse begreber? Jeg syntes jeg
>>kan huske noget fra skoletiden, men det ilgger godt nok lidt fjernt...
>
> Jeg allierer mig tit med MS Access, der har et udmærket interface til
> opbygning af SQL-strenge, samt hjælp til samme.
Jeg tror det ville have gjort dine indlæg lidt klarere, hvis du havde
nævnt, at TRANSFORM er en Access-specifik funktion. Hvis man ikke er
velbevandret i Access er det forvirrende, at TRANSFORM ikke lige sådan er
forklaret i normal SQL-litteratur - andet som et begreb der handler om at
omskrive ét SQL-udtryk til et andet med samme effekt.
--
Greetings from Troels Arvin, Copenhagen, Denmark
| |
Jan Bachman (10-12-2003)
| Kommentar Fra : Jan Bachman |
Dato : 10-12-03 21:01 |
|
>Jeg tror det ville have gjort dine indlæg lidt klarere, hvis du havde
>nævnt, at TRANSFORM er en Access-specifik funktion. Hvis man ikke er
>velbevandret i Access er det forvirrende, at TRANSFORM ikke lige sådan er
>forklaret i normal SQL-litteratur - andet som et begreb der handler om at
>omskrive ét SQL-udtryk til et andet med samme effekt.
Ah, det vidste jeg ikke. Tak fordi du afklarede det
/Jan
| |
Thomas Rokamp (10-12-2003)
| Kommentar Fra : Thomas Rokamp |
Dato : 10-12-03 23:34 |
|
Der må da findes en tekst et sted, der forklarer på lidt mere menneskesprog,
hvad eksempelvis forskellen er på en left og en right join (hvis der findes
en sådan?), en join og en inner join og alt det der...
/Thomas
| |
Morten Wulff (11-12-2003)
| Kommentar Fra : Morten Wulff |
Dato : 11-12-03 00:00 |
|
On Wed, 10 Dec 2003 23:33:37 +0100, Thomas Rokamp <no_spam@crax.dk> wrote:
> Der må da findes en tekst et sted, der forklarer på lidt mere
> menneskesprog,
> hvad eksempelvis forskellen er på en left og en right join (hvis der
> findes
> en sådan?), en join og en inner join og alt det der...
Jeg synes at følgende artikel er en fornuftig introduktion:
http://www.devshed.com/Server_Side/MySQL/SQLJoins/print_html
mvh,
Morten Wulff
--
Self Injury Information and Support: www.psyke.org
"I have a school book with my name on it."
"Your parents must be so proud." ( http://www.actsofgord.com/)
| |
Thomas Rokamp (11-12-2003)
| Kommentar Fra : Thomas Rokamp |
Dato : 11-12-03 00:04 |
|
"Morten Wulff" <wulff@ratatosk.net> skrev i en meddelelse
news rzzl6dk43cya22@sunsite.dk...
> On Wed, 10 Dec 2003 23:33:37 +0100, Thomas Rokamp <no_spam@crax.dk> wrote:
>
> Jeg synes at følgende artikel er en fornuftig introduktion:
>
> http://www.devshed.com/Server_Side/MySQL/SQLJoins/print_html
>
Mange tak!
| |
|
|