Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]10969[/thread]

SQL-Abfrage formulieren



<< |< 1 2 >| >> 18 Einträge, 2 Seiten
MartinR
 2007-12-07 13:30
#103554 #103554
User since
2004-06-17
305 Artikel
BenutzerIn
[default_avatar]
Hi,

ich habe folgende drei Tabellen:

Tabelle Personal

p_id | name
1 | Meier
2 | Mueller
3 | Huber
4 | Schmid
5 | Meister

Tabelle Abteilungen

a_id | abteilung
1 | Verkauf
2 | Werbung
3 | Lager
4 | Leitung
5 | Buchhaltung

Tabelle Zuordnung

z_id | p_id | a_id | datum
1 | 1 | 1 | 2007-01-01
2 | 1 | 2 | 2007-03-01
3 | 1 | 5 | 2007-06-01
4 | 1 | 1 | 2007-07-01
5 | 2 | 3 | 2007-01-01
6 | 3 | 2 | 2007-01-01
7 | 3 | 4 | 2007-04-01
8 | 4 | 3 | 2007-02-01
9 | 4 | 1 | 2007-03-01
10 | 5 | 4 | 2007-01-01
11 | 2 | 1 | 2007-03-01
12 | 2 | 3 | 2007-05-01

Ist glaube ich selbsterklärend. Nur soviel: In der Tabelle Zuordnung ist abgelegt wer (p_id) ab wann (datum) in welcher Abteilung (a_id) eingesetzt ist.

Nun meine Frage: Wie kann ich nun in einer Abfrage ermitteln welche Personen zu einem bestimmten Datum (z.B. 10.4.07) in einer bestimmten Abteilung beschäftigt waren?
renee
 2007-12-07 14:13
#103560 #103560
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
ungetestet:[sql]SELECT Personal.p_id, name
FROM Personal, Abteilungen, Zuordnung
WHERE Personal.p_id = Zuordnung.p_id AND
Abteilungen.a_id = Zuordnung.a_id AND
datum = '2007-04-01' AND
abteilung = 'Leitung'[/sql]
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Siechfred
 2007-12-07 14:24
#103564 #103564
User since
2007-11-12
30 Artikel
BenutzerIn
[default_avatar]
Knifflige Geschichte, ich würde es so versuchen:

[sql]SELECT
Abteilung.name AS Name,
Personal.name AS Abteilung,
Zuordnung.date AS seit
FROM (Zuordnung
LEFT JOIN Abteilung ON Zuordnung.a_id = Abteilung.a_id
)
LEFT JOIN Personal ON Zuordnung.p_id = Personal.p_id
WHERE Zuordnung.date <= '2007-09-30'
GROUP BY Zuordnung.p_id[/sql]

Ansonsten lege ich Dir in solchen Fällen Folgendes ans Herz:
Einführung in JOINs
Fortgeschrittene JOIN-Techniken

HTH,
Siechfred
MartinR
 2007-12-07 22:10
#103599 #103599
User since
2004-06-17
305 Artikel
BenutzerIn
[default_avatar]
@renee

Danke für die Antwort, aber ich glaube Du hast mein Problem falsch verstanden. Soweit wäre ich auch noch selbst gekommen ;-)

@Siechfred

Ich glaube Du hast hier in Deinem SQL einige Felder durcheinandergebracht. Macht aber auch nihts. Diesen Ansatz hatte ich auch schon erfolglos verfolgt.

Mein erster Versuch ging noch davon aus, dass ich in der Tabelle Zuordnung zwei Datumsspalten anlege, nämlich "datum_von" und "datum_bis". So komme ich auch zum Ziel. Nur nervt mich der Aufwand immer auch ein "datum_bis" anlegen zu müssen wo ich noch gar nicht weis wie lange der Kollege in einer Abteilung beschäftigt ist. Also als Default immer erst mal den 31.12.2099 eingeben und dann bei jeder Änderung dieses zu editieren. Da dachte ich, es müsse doch auch mit nur einem "datum_vom" gehen. Hab aber noch keinen Ansatz gefunden ...
Gast Gast
 2007-12-12 01:30
#103749 #103749
Hi,

nimm das Ding von Renee, das sieht gut aus. Und tu sein Datum durch diesen String ersetzen:

datum=TO_DATE('23.11.2007 14:44:23','dd.MM.yyyy HH24:mi:ss')

vorraussetzng ist natürlich dass die Spalte das Format Date besitzt.
Besser ist das ganze natürlich wenn du es mit between umschreiben würdest:

where
...AND
(datum between TO_DATE('23.11.2007 14:44:23','dd.MM.yyyy HH24:mi:ss') and TO_DATE('07.12.2007','dd.MM.yyyy'))
AND ...

Wenn es nicht Format 'date' ist, bist du selber schuld *g*
MartinR
 2007-12-12 23:36
#103809 #103809
User since
2004-06-17
305 Artikel
BenutzerIn
[default_avatar]
Hallo Gast,

renee hat mein Problem falsch verstanden.

Drum nochmal zur Erklärung:

Angenommen ich bin Hr. Meier ( also ID 1 ) und fange am 1.1.07 im Betrieb an zu arbeiten. Da ich den ganzen Betrieb kennenlernen will durchlaufe ich folgende Stationen:

Vom 1.1.07 bis zum 28.2. Abteilung Verkauf ( 1 )
Vom 1.3.07 bis zum 31.5. Abteilung Werbung ( 2 )
Vom 1.6.07 bis zum 30.6. Abteilung Buchhaltung ( 5 )
Seit dem 1.7.07 - Ende noch offen - bin ich nun wieder im Verkauf ( 1 )


So, und nun will ich aber wissen wer alles am 10.04.07, also an einem beliebigen Datum das NICHT in der DB erfasst ist, in der Abteilung Werbung beschäftigt war. Da müsste ja der Meier auftauchen. Wenn ich aber zum 10.4. in der Abteilung Verkauf schaue darf der Meier nicht auftauchen.

Wie gesagt: Mit festen Beginn- und Ende-Terminen, also zwei Datenfeldern habe ich das schon hinbekommen. Ich möchte mir aber den Logik- und Pflegeaufwand für das Endedatum sparen ...
pktm
 2007-12-13 02:16
#103812 #103812
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Und was ist, wenn du einfach 2 Felder nimmst, und das End-Datum leer lassen kannst? Wenn es dann leer ist setzt du da NOW() ein und schon ists fertig.
http://www.intergastro-service.de (mein erstes CMS :) )
renee
 2007-12-13 10:03
#103814 #103814
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
ungetestet [sql] SELECT DISTINCT Personal.p_id, name
FROM Personal, Abteilungen, Zuordnung
WHERE Personal.p_id = Zuordnung.p_id AND
Abteilungen.a_id = Zuordnung.a_id AND
datum > '2007-04-01' AND
abteilung = 'Leitung' ORDER BY Perlsonal.p_id, datum ASC[/sql]
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
MartinR
 2007-12-13 15:02
#103821 #103821
User since
2004-06-17
305 Artikel
BenutzerIn
[default_avatar]
Hallo renee,

danke aber wieder knapp vorbei ;-)

Mit Deiner Abfrage bekomme ich ja nur die Leute raus, die nach dem 1.4. in einer Abteilung angefangen haben zu arbeiten. Ich will aber alle Kollegen finden, die am 1.4. bereits in einer Abteilung beschäftigt sind. Also auch alle bei denen dann im Feld Datum z.B. 1.3.07 steht.

@pktm
Wie gesagt: Mit zwei Feldern läuft es ja bereits. Ich würde es nur gerne eben mit nur einem Feld hinbekommen. Bischen kleinlich, ich weiß ...
renee
 2007-12-13 15:13
#103822 #103822
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Naja, dann dürfte die Anpassung meines Statements ja nicht allzu schwer sein, oder?

Aus dem '>' einfach ein '<' machen und aus dem 'ASC' ein 'DESC'...

Das sollte dann hinhauen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2007-12-07 13:30.