SQL-Statement gesucht

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/sql-statement_gesucht_163300/page_1 - zur Vollversion wechseln!


fresserettich schrieb am 21.05.2006 um 16:07

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


d3ft0n3 schrieb am 21.05.2006 um 16:11

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;


rettich schrieb am 21.05.2006 um 16:19

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 schrieb am 21.05.2006 um 16:58

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


3mind schrieb am 21.05.2006 um 17:08

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.


fresserettich schrieb am 21.05.2006 um 17:19

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 schrieb am 21.05.2006 um 17:53

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 schrieb am 21.05.2006 um 17:55

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


3mind schrieb am 21.05.2006 um 18:00

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 schrieb am 21.05.2006 um 18:09

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')
  )


3mind schrieb am 21.05.2006 um 18:38

werds ma gleich mal anschauen...


rettich schrieb am 21.05.2006 um 18:42

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 schrieb am 21.05.2006 um 18:56

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 schrieb am 21.05.2006 um 18:57

ach, damn it - jetzt wollt ich das auch grad posten.
naja, hauptsach es funktioniert jetzt.


fresserettich schrieb am 22.05.2006 um 00:39

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




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025