Thema: Delphi Problem mit UNION Select

Einzelnen Beitrag anzeigen

omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#57

Re: Problem mit UNION Select

  Alt 7. Mai 2008, 22:30
So nachdem du nun ordentliche Beispieldaten geliefert hast, habe ich mir das nochmal angesehen.

1. leg bitte in deinen Tabellen auch einen Primary Key an (benutze Contraints!)
2. benutze bitte adiquate Datentypen für deine Tabellenspalten, also für dein Datum auch den Typ Date
3. benutze immer für lange Texte den Typ VARCHAR, der verbraucht nur so viel Speicher wie benötigt wird.
CHAR benutzt immer die komplette Größe

Hier mal ein Vorschlag für deine Tabellenstruktur...
SQL-Code:
CREATE TABLE TEMP2007(
  DATUM DATE NOT NULL,
  PERSONALNR CHAR(4) NOT NULL,
  URLAUB CHAR(4),
  KURZZEICHEN CHAR(2) NOT NULL,
  MEMO CHAR(1),
  MEMOTEXT VARCHAR(250),
  AENDERUNG DATE,
  AENDERUNGVON CHAR(10),
  CONSTRAINT PK_TEMP2007_1 PRIMARY KEY (DATUM, PERSONALNR)
);
Dabei wird jetzt keine Tag-, Monat-, Jahr-Spalte mehr benötigt, da diese Daten aus dem Datum extrahiert werden können.
Stichwort: Redundanz!

Hier mal ein Vorschlag für deine gewünschte Auswertung...
SQL-Code:
SELECT EXTRACT(YEAR FROM datum) jahr,
       EXTRACT(MONTH FROM datum) monat,
       personalnr,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 1 THEN kurzzeichen ELSE NULL END) AS t1,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 2 THEN kurzzeichen ELSE NULL END) AS t2,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 3 THEN kurzzeichen ELSE NULL END) AS t3,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 4 THEN kurzzeichen ELSE NULL END) AS t4,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 5 THEN kurzzeichen ELSE NULL END) AS t5,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 6 THEN kurzzeichen ELSE NULL END) AS t6,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 7 THEN kurzzeichen ELSE NULL END) AS t7,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 8 THEN kurzzeichen ELSE NULL END) AS t8,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 9 THEN kurzzeichen ELSE NULL END) AS t9,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 10 THEN kurzzeichen ELSE NULL END) AS t10,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 11 THEN kurzzeichen ELSE NULL END) AS t11,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 12 THEN kurzzeichen ELSE NULL END) AS t12,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 13 THEN kurzzeichen ELSE NULL END) AS t13,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 14 THEN kurzzeichen ELSE NULL END) AS t14,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 15 THEN kurzzeichen ELSE NULL END) AS t15,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 16 THEN kurzzeichen ELSE NULL END) AS t16,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 17 THEN kurzzeichen ELSE NULL END) AS t17,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 18 THEN kurzzeichen ELSE NULL END) AS t18,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 19 THEN kurzzeichen ELSE NULL END) AS t19,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 20 THEN kurzzeichen ELSE NULL END) AS t20,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 21 THEN kurzzeichen ELSE NULL END) AS t21,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 22 THEN kurzzeichen ELSE NULL END) AS t22,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 23 THEN kurzzeichen ELSE NULL END) AS t23,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 24 THEN kurzzeichen ELSE NULL END) AS t24,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 25 THEN kurzzeichen ELSE NULL END) AS t25,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 26 THEN kurzzeichen ELSE NULL END) AS t26,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 27 THEN kurzzeichen ELSE NULL END) AS t27,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 28 THEN kurzzeichen ELSE NULL END) AS t28,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 29 THEN kurzzeichen ELSE NULL END) AS t29,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 30 THEN kurzzeichen ELSE NULL END) AS t30,
       MAX(CASE WHEN EXTRACT(DAY FROM datum) = 31 THEN kurzzeichen ELSE NULL END) AS t31
FROM temp2007
GROUP BY EXTRACT(YEAR FROM datum), EXTRACT(MONTH FROM datum), personalnr
ORDER BY EXTRACT(YEAR FROM datum), EXTRACT(MONTH FROM datum), personalnr
Bedenke aber dabei, dass es pro Datum+Person jetzt nur noch eine Zeile geben kann, dies wird durch den angelegten Primary Key eingehalten.

Geänderte Datenbank habe ich angehängt.

Hoffe das hilft dir weiter...

Gruss
Thorsten
Angehängte Dateien
Dateityp: zip planer_105.zip (177,0 KB, 3x aufgerufen)
  Mit Zitat antworten Zitat