php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 11.01.2012, 23:46  
Neuer Benutzer
 
Registriert seit: 11.01.2012
Beiträge: 7
PHP-Kenntnisse:
Anfänger
Thorahn80 befindet sich auf einem aufstrebenden Ast
Standard Kreuztabellenabfrage

Hallo zusammen,

zunächst möchte ich anmerken, dass ich kein MySQL Profi bin. Bisher reichten meine Kenntnisse jedoch immer aus um das gewünschte Resultat zu erhalten.

Ich benötige eine Kreuztabellenabfrage über zwei Abfragen und hoffe, dass mir hier jemand helfen kann. Habe fast den ganzen Tag gesucht, jedoch leider nichts wirklich passendes gefunden. In Access ist es recht simpel und funktioniert auch einwandfrei. Leider kann MySQL die Syntax von Access-SQL nicht verarbeiten.

Abfrage Mitarbeiter ist wie folgt:
datum
persnr
name

Abfrage Abwesenheit:
persnr
datum
ausfall

In der Abfrage Mitarbeiter Spalte datum sind alle Kalendertage vom ersten bis zum letzten eines bestimmten Monats enthalten. Dieser Monat ist für jeden einzelnen Mitarbeiter komplett enthalten. Gibt es z. B. 10 Namen dann ist auch 10 x der Monat März vom 01. bis 31. in der Abfrage enthalten.
In der Abfrage Ausfall ist der jeweilige Ausfallgrund einem Datum und einem Mitarbeiter zugeordnet.

Das gewünschte Ergebnis ist jetzt, dass eine Art Matrix (Kreuztabelle) entsteht, in welcher links 1 x das Datum als Spalte angezeigt wird und als weitere Spaltenbeschriftungen die einzelnen Mitarbeiter. Innerhalb der Matrix soll dann der Ausfallgrund angezeigt werden.

I.datum.I.mitarb1.I.mitarb2.I.mitarb3.I usw.
--------------------------------------------
I 01.01. I............I.............I............I
I 02.01. I Urlaub I.............I............I
I 03.01. I............I.............I Krank I
I 04.01. I............I Urlaub I............I

Falls neue Mitarbeiter hinzu kommen, sollte die Abfrage diese automatisch als neue Spalte hinzufügen.

In Access war es wie geschrieben recht einfach. Der dortige SQL-Befehl sah wie folgt aus:
TRANSFORM First(abwesenheiten.ausfall) AS ErsterWertvonausfall
SELECT Mitarbeiter.datum
FROM Mitarbeiter LEFT JOIN abwesenheiten ON (Mitarbeiter.persnr = abwesenheiten.persnr) AND (Mitarbeiter.datum = abwesenheiten.datum)
GROUP BY Mitarbeiter.datum
PIVOT Mitarbeiter.Name;

Hoffe es kann mir jemand helfen
Thorahn80 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 12.01.2012, 00:05  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

So ein Kommando gibt es in MySQL nicht.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 12.01.2012, 00:23  
Neuer Benutzer
 
Registriert seit: 11.01.2012
Beiträge: 7
PHP-Kenntnisse:
Anfänger
Thorahn80 befindet sich auf einem aufstrebenden Ast
Standard

Dann ist eine Umsetzung des Ergebnisses in MySQL nicht möglich?
Thorahn80 ist offline   Mit Zitat antworten
Alt 12.01.2012, 08:52  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

doch - aber das Ergebnis wird anders aussehen, als bisher in Access - und das ist auch gut so

dafür brauchst du eigentlich "bloß" den mittleren Teil der Abfrage

Code:
SELECT Mitarbeiter.datum
FROM Mitarbeiter 
LEFT JOIN abwesenheiten 
ON (Mitarbeiter.persnr = abwesenheiten.persnr) 
   AND (Mitarbeiter.datum = abwesenheiten.datum)
GROUP BY Mitarbeiter.datum
- und am besten wäre es, du gibst den Mitarbeiter vor, zu dem du deine Abwesenheits-Abfrage stellst
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 12.01.2012, 20:57  
Neuer Benutzer
 
Registriert seit: 11.01.2012
Beiträge: 7
PHP-Kenntnisse:
Anfänger
Thorahn80 befindet sich auf einem aufstrebenden Ast
Standard

Hi,

also ich es jetzt mal mit dem mittleren Teil versucht. Leider bekomme ich da als Ergebnis nur eine Spalte mit dem Datum.

Zitat:
dafür brauchst du eigentlich "bloß" den mittleren Teil der Abfrage
Ich hab es dann mit folgender Abfrage versucht die mich meinem Ergebnis dann relativ nahe bringt. Zumindest stimmt das was er an Daten auswirft.

Code:
SELECT Mitarbeiter.datum, Mitarbeiter.Name, abwesenheiten.ausfall 
FROM Mitarbeiter 
LEFT JOIN abwesenheiten
ON abwesenheiten.datum = Mitarbeiter.datum
    AND abwesenheiten.persnr = Mitarbeiter.persnr 
ORDER BY Mitarbeiter.persnr, Mitarbeiter.datum;
Leider wäre es so sinnig, wie du schon schreibst, vorab einen bestimmten Mitarbeiter auszuwählen. Mein Ziel war es jedoch eine Übersicht von allen Mitarbeitern gleichzeitig zu erhalten.

Kann man vielleicht eine Tabelle automatisiert erzeugen lassen, wo die Spaltenbezeichnungen aus einer Selectanweisung generiert werden?
Thorahn80 ist offline   Mit Zitat antworten
Alt 12.01.2012, 21:13  
Erfahrener Benutzer
 
Registriert seit: 01.06.2011
Beiträge: 389
PHP-Kenntnisse:
Anfänger
achtelpetit befindet sich auf einem aufstrebenden Ast
Standard

Die SQL-Syntax für Kreuztabellen ist eine Spezialität von Access, kein Standard, leider.
Aber schau mal hier: http://dev.mysql.com/tech-resources/...t_version.html
achtelpetit ist offline   Mit Zitat antworten
Alt 12.01.2012, 21:45  
Neuer Benutzer
 
Registriert seit: 11.01.2012
Beiträge: 7
PHP-Kenntnisse:
Anfänger
Thorahn80 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Die SQL-Syntax für Kreuztabellen ist eine Spezialität von Access, kein Standard, leider.
Aber schau mal hier: http://dev.mysql.com/tech-resources/...t_version.html
Danke Dir für den Tip. Den Artikel kenne ich. Problem an dem Artikel ist jedoch wohl, dass die Werte statisch sein müssen. Bei mir scheint es ein wenig komplexer zu sein, da die Spalten für die Mitarbeiternamen jedes mal neugeneriert werden müssen (Bin ja theoretisch faul und will nicht bei jedem neuen Mitarbeiter die Abfrage ändern bzw. anpassen müssen).

Echt verdammt schade, dass MySQl keine Kreuzabfragen kann.
Thorahn80 ist offline   Mit Zitat antworten
Alt 12.01.2012, 21:50  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Klassische realtionale Datenbanken sind eben keine UI-Sprachen, sondern die Datenschicht eine Anwendung. Access war schon immer sehr nahe an Office/Excel und daher haben sie das vermutlich direkt implementiert.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 12.01.2012, 22:14  
Erfahrener Benutzer
 
Registriert seit: 01.06.2011
Beiträge: 389
PHP-Kenntnisse:
Anfänger
achtelpetit befindet sich auf einem aufstrebenden Ast
Standard

@Nikosch
Die Jet-Engine spricht einen SQL-Dialekt. Jedes DB-System hat Spezialitäten in seiner SQL-Syntax, die nicht für alle gelten.
Die Verwandtschaft zwischen Excel und Access besteht in der Hauptsache darin, daß beide Programme sehr gut per VBA automatisiert werden können und auch wunderbar miteinander und mit Word oder Outlook kommunizieren können.

@Thorahn80
Zitat:
will nicht bei jedem neuen Mitarbeiter die Abfrage ändern bzw. anpassen müssen
Da wirst Du wohl mit PHP die entsprechende Automatik konstruieren müssen, um die SQL-Statements programmatorisch zu erzeugen.
achtelpetit ist offline   Mit Zitat antworten
Alt 12.01.2012, 22:24  
Neuer Benutzer
 
Registriert seit: 11.01.2012
Beiträge: 7
PHP-Kenntnisse:
Anfänger
Thorahn80 befindet sich auf einem aufstrebenden Ast
Standard

Bin dabei dachte nur ich hätte mir die tipperei sparen können. Wird nur kein PHP-Code sondern VB ... Vielleicht hat ja trotzdem jemand Interesse an dem fertigen VB-Code. Ist er ja evtl. relativ leicht in PHP zu übersetzen.

Also bei Interesse einfach noch mal posten.
Thorahn80 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php kreuztabelle, php kreuztabellenabfrage, mysql kreuztabelle, php mysql kreuztabelle, kreuztabellenabfrage, php mysql-query mit php als kreuztabelle, access kreuztabelle datum spalte, access kreuztabelle matrix, wann entstehen kreuztabellen in den db, ausfallzeiten je mitarbeiter als pivot tabelle?, kreuztabelle in mysql, mysql kreuztabelle 2012, mysql-query mit php als kreuztabelle, 14 er kreuztabellen matrix, kreuztabellen abfrage viual basic 2010, vb 2005 kreuzabfrage, kreuztabellen abfrage automatisch

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:33 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum