"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

SQL-Statement gesucht

fresserettich 21.05.2006 - 16:07 813 14
Posts

fresserettich

Here to stay
Registered: Jul 2002
Location: hier
Posts: 5378
Hallo!

Ich suche ein SQL-Statement was folgendes macht:
ich habe in einer tabelle mehrere spalten (name,vname,...) darunter die 3 spalten projekt1,projekt2,projekt3
in diesen tables stehen einfach namen z.B. p1,p2,p3, ...
ich möchte aus diesen 3 spalten eine machen und die eventuell vorhanden redunanzen beseitigen
habe jetzt schon ziemlich lang gewerkt und bringe es einfach nicht hin.
Bitte keine Diskussion über die Wahl der Tabellen Struktur, denn ich weil genau diese völlig nicht normalisierte tabelle in eine vernüpftige form bringen
Bearbeitet von fresserettich am 21.05.2006, 18:56

d3ft0n3

grinder
Avatar
Registered: Apr 2003
Location: Graz
Posts: 748
hmmm, vllt. so in etwa:

CREATE VIEW tablename_view (col1, col2, coln, projekt) AS
SELECT col1, col2, coln, (SELECT projekt1, projekt2, projekt3
FROM tablename
WHERE projekt2 NOT IN (SELECT projekt2 FROM tablename; )
AND projekt3 NOT IN (SELECT projekt1 FROM tablename; )
AND projekt3 NOT IN (SELECT projekt2 FROM tablename; ))
FROM tablename;
Bearbeitet von d3ft0n3 am 21.05.2006, 16:22

rettich

Legend
waffle, waffle!
Avatar
Registered: Jan 2004
Location: wien
Posts: 794
wie soll das funktionieren, "die redundanzen beseitigen"? bzw was für ein ergebnis erwartest du, wenns KEINE redundanzen gibt, sondern in einem record verschiedene projekte eingetragen sind?

zB wenn in record nr 17 bei name "hansi", bei projekt1 "blah", bei projekt2 "blubb" steht, was soll rauskommen?


mit der funktion COALESCE kannst du mehrere spalten zu einer machen: folgende regel: er nimmt die, die als erste nicht NULL ist.

aus
name - projekt1 - projekt2 - projekt3
hansi - blah - blubb - NULL

würdest du mit

select name, COALESCE(projekt3,projekt2,projekt1) as projekt from table

das ergebnis
name - projekt
hansi - blubb

bekommen. ich befürchte aber, damit kann man dein problem nicht lösen.

fresserettich

Here to stay
Registered: Jul 2002
Location: hier
Posts: 5378
na ja es kann sein dass der mitarbeiter aus der zeile 1 im pr1
mitgearbeitet hat und der mitarbeiter x auch wo jetzt pr1 in der spalte projekt1,projekt2,projekt3 steht kann man ja nicht wissen
als ergebnis soll einfach jede projekt-bezeichnung nur einmal dastehen
also ergebnis:
pr1
pr2
.
.
.

ungefähr klar was ich will?
edit:
die redundanz besteht darin, dass eben eine projektbezeichnung mehrmals vorkommen kann
ich will eigentlich nur aus den daten die ganzen projektbezeichnungen in eine eigene projekte-table überführen
ich will aus den 3 spalten wo projektbezeichungen drinnen stehen eine spalte machen wo jede bezeichnung nur einmal vorkommt
meine lösung die mir eingefallen ist, würde so ausschauen alle dreispalten in eine dummy table speichern und dann einfach mit distinct die datensätze in die projekte-table kopieren
Bearbeitet von fresserettich am 21.05.2006, 17:04

3mind

mimimi
Avatar
Registered: Sep 2004
Location: 1030
Posts: 1588
hm, dann is vielleicht 'distinct' das was du suchst.

so ungefähr:

Code:
SELECT DISTINCT (Projekt1, Projekt2, Projekt3) 
FROM <Tablename>
AS Projekt;


hth a bit.
Bearbeitet von 3mind am 21.05.2006, 17:11

fresserettich

Here to stay
Registered: Jul 2002
Location: hier
Posts: 5378
Zitat von 3mind
hm, dann is vielleicht 'distinct' das was du suchst.

so ungefähr:

Code:
SELECT DISTINCT (Projekt1, Projekt2, Projekt3) 
FROM <Tablename>
AS Projekt;


hth a bit.
hätte ich auch schon veruscht
bekome leider den fehler rechte klammer fehlt

3mind

mimimi
Avatar
Registered: Sep 2004
Location: 1030
Posts: 1588
schon ohne klammer probiert?
wobei dann wird vermutlich das distinct nur auf projekt1 angewandt, oder?


edit:

<quote>
The DISTINCT clause can be used with more than one field.

For example:

SELECT DISTINCT city, state
FROM supplier;

This select statement would return each unique city and state combination. In this case, the distinct applies to each field listed after the DISTINCT keyword.
</quote>


vielleicht gehts ja so?

fresserettich

Here to stay
Registered: Jul 2002
Location: hier
Posts: 5378
dann bekomm ich 3 einzelne spalten ...

bin irgendwie am verzweifeln
ich hab mir jetzt eine table dummy anlegt dort mach ich
insert into dummy select distinct projekt1 from ext_daten;
das für die andern 2 spalten auch
so jetzt sind einige spalten null
wenn ich diese jetzt löschen will dann bekomm ich immer 0 zeilen gelöscht
habe zur sicherheit einen datensatz mit null hinzufüget delete dummy where column1 = null bewirkt genau nix :(
edit: wenn man halt noch wüsste dass man null mit is null bzw. is not null abprüft soll würde man sich solch einen post sparen
Bearbeitet von fresserettich am 21.05.2006, 18:05

3mind

mimimi
Avatar
Registered: Sep 2004
Location: 1030
Posts: 1588
hm, wenns geht post doch mal das create statement für deine tabelle, inkl. entsprechenden sample inserts.

dann kann ich wenn ich zeit hab mal bei mir in der datenbank herumprobieren.

fresserettich

Here to stay
Registered: Jul 2002
Location: hier
Posts: 5378
brauchs aber morgen :D
ich hol mir die daten aus einer external table kannst dir aber das create statment daraus entnehmen
test-daten siehe anhang
Code: PHP
create table ext_daten2(vname varchar(30), nname varchar(30), gebdatum varchar(15),
    telefon varchar (30), mobil varchar (30),
    projekt1 varchar(10), dauer1 number,
    projekt2 varchar(10),dauer2 number,
    projekt3 varchar(10), dauer3 number,
    plz varchar(4), ort varchar(30), job varchar(30))
    organization external
    (
     type oracle_loader
    default directory DCmartin
    access parameters
    (records delimited  by newline
    Fields terminated  by ';'
    missing field values are null)
    Location ('adat.csv')
  )
daten_94691.txt (downloaded 52x)

3mind

mimimi
Avatar
Registered: Sep 2004
Location: 1030
Posts: 1588
werds ma gleich mal anschauen...

rettich

Legend
waffle, waffle!
Avatar
Registered: Jan 2004
Location: wien
Posts: 794
ich würde folgendes machen - die datenbank normalisieren.

dh du erstellst eine tabelle "projekte" mit feldern "id" und "projektname". die füllst du mit einem

select distinct projekt1 as projektname from ext_daten2
union
select distinct projekt2 as projektname from ext_daten2
union
select distinct projekt3 as projektname from ext_daten2

damit hast mal alle projekte unique aufgelistet.

jetzt brauchst eine intersection-table, in der du projekte und mitabeiter auskreuzt:

table x_ma_proj, felder "id", "ma_id", "proj_id"

und jetzt trägst du für jeden mitarbeiter, der werte in projekt1,2 oder 3 hat, einen passenden eintrag mit mitarbeiter_id und projekt_id ein. du erhältst damit für jedes gefundene projekt einen eintrag.

damit hast du die m:n beziehung zwischen mitarbeitern und projekten datenbanktechnisch korrekt abgebildet

mitarbeiter <- x_ma_proj -> projekte

fresserettich

Here to stay
Registered: Jul 2002
Location: hier
Posts: 5378
rettich wieso hast mir des mit den union nicht gleich gepostet? genau das hab ich gebraucht meine lösung war jetzt die einzelnen statments die du mit dem union vereint hast in eine dummy table zu stecken und dann mit distinct die werte zu filtern :)
normalisiert hab ich schon aufabe: ist man bekommt halt ein nicht normalisiertes excel-blatt so wie es halt viele firmen machen die keine richtige edv haben und ich möcht des schön sauber in eine db bringen
des was du dann beschrieben hast geht schon
des statement zum insert ist dann im sql + 7 zeilen lang :D
i sag nur rettich for president :)

3mind

mimimi
Avatar
Registered: Sep 2004
Location: 1030
Posts: 1588
ach, damn it - jetzt wollt ich das auch grad posten.
naja, hauptsach es funktioniert jetzt.

fresserettich

Here to stay
Registered: Jul 2002
Location: hier
Posts: 5378
is wohl doch noch nicht ganz gelöst insert into projekte (sub-select von rettich);
funzt leider nicht :(
na ok doch nur man muss insert into projekte projekt1 from (select rettich)

ich werds für heute bleiben lassen
Bearbeitet von fresserettich am 22.05.2006, 00:42
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz