/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
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
newsrzzl6dk43cya22@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!



Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408518
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste