Delphi-PRAXiS
Seite 1 von 8  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem mit UNION Select (https://www.delphipraxis.net/113349-problem-mit-union-select.html)

mu8zeh 6. Mai 2008 15:13

Datenbank: Firebird 1.5 • Zugriff über: ZQuerry

Problem mit UNION Select
 
Hallo

Ich habe ein Problem beim erstellen einer UNION

Beisp.
Tabelle 1
Tag
1
2
3
4
5
6
.
.
31

Tabelle 2

TAG_______|MERKMAL|PERSNR
01.01.2008...String.....|String
02.01.2008
03.01.2008
04.01.2008
05.01.2008
06.01.2008
.
.
31.01.2008...|String.....|String



SQL.SELECT PERSNR, dTAG([Tag]) as Date, MERKMAL FROM TABELLE2
UNION 0 SELECT TAG, 0,0
FROM TABELLE1

Nun sollte das ganze so ausehen

DBGrid
PERSNR__1_2_3_4_5_6__31
001.....A..B..A..A..B..B..........C
002.....A..B..A..A..B..B..........C

In Access(Abfrage) funktioniert das.
Habe ich da einen Denkfehler? :wall:

Vielen Dank für eine Unterstützung

mkinzler 6. Mai 2008 15:20

Re: Problem mit UNION Select
 
Ich verstehe nicht ganz was du vorhast

mu8zeh 6. Mai 2008 15:35

Re: Problem mit UNION Select
 
Hallo und Danke


also Standartmässig werden die Daten unternander in Tabelle 2 gespeichert.
[u]Datum__|M|PERSNR
01.01.2008|A|001
02.01.2008|A|001
01.01.2008|B|002
02.01.2008|B|002
usw.

Für eine Ansicht in einem DBGrid brauche ich diese Daten aber nebeneinander.

PersNR|Datum|Datum|Datum >>> usw.

Ich hatte das mit einem StringGrid und SQL abgrage.
Wenn die Daten aber mehr als 100 sind ist das für eine optimale anzeige zu langsam.

mkinzler 6. Mai 2008 15:37

Re: Problem mit UNION Select
 
Das geht aber nicht mit einem UNION. Nennt man Übrigens Pivot.
is die Anzahl der Datensätze pro PersNr bekannt?

mu8zeh 6. Mai 2008 15:45

Re: Problem mit UNION Select
 
Hallo

die Anzahl ändert sich je nach eingabe

Mal noch ein bsp. wie ich's jetzt habe. Bis zu 5 PERSNR geht's ganz flott.

//**********************************
//Datum wird bereit gestellt
//**********************************

With Form1.StringGrid1 do begin
For NZ:= 4 to ColCount do begin
Cells[NZ,4]:= '';
Cells[NZ,0]:= FormatDateTime('ddd',dDatum);
Cells[NZ,1]:= FormatDateTime('dd',dDatum);
Cells[NZ,2]:= FormatDateTime('m',dDatum);
Cells[NZ,3]:= FormatDateTime('YYYY',dDatum);
Cells[NZ,5]:= FormatDateTime('mm',dDatum);
dDatum := dDatum +1;
end;
end;

//************************************************** ***************
//Daten werden geladen
//************************************************** ***************
procedure TForm1.LadeDaten(Sender: TObject; d,m,X,Y,Z,S: Integer);
begin

Z := 0;
while StringGrid2.Cells[0,Z]<> '' do begin
inc(S);
inc(Z);
end;

Z := 0;
with StringGrid2 do
while StringGrid2.Cells[0,Z]<> '' do begin
mxStatusBar1.Panels[3].ProgressBar.Min := 0;
mxStatusBar1.Panels[3].ProgressBar.Max := S;
mxStatusBar1.Panels[3].ProgressBar.Position := Z;

with DataModule1.ZTEMP2007 do begin
SQL.Clear;
SQL.Add('SELECT TEMP2007.DATUM, TEMP2007.TAG, TEMP2007.MONAT, '+
'TEMP2007.JAHR, TEMP2007.PERSONALNR, TEMP2007.URLAUB, '+
'TEMP2007.KURZZEICHEN, TEMP2007.MEMOTEXT, TEMP2007.AENDERUNG, '+
'TEMP2007.AENDERUNGVON, KATEGORIE.COLOR FROM TEMP2007 '+
'INNER JOIN KATEGORIE ON (TEMP2007.KURZZEICHEN = '+
'KATEGORIE.KURZZEICHEN) WHERE TEMP2007.PERSONALNR = '+
QuotedStr(StringGrid2.Cells[0,Z]) +' AND TEMP2007.MONAT >= '+
QuotedStr(StringGrid1.Cells[4,5]) +' AND TEMP2007.JAHR = '+
QuotedStr(StringGrid1.Cells[4,3])+
' AND TEMP2007.KURZZEICHEN <> '+ QuotedStr('-')+' ORDER BY MONAT, TAG');
Active := True;
with StringGrid1 do begin
For X := 4 to StringGrid1.ColCount -1 do begin
Datum := StrToDate(Cells[X,1] + '.' + Cells[X,5] + '.' + Cells[X,3]);
First;
While Not Eof do begin
if FieldValues['DATUM'] = DateToStr(Datum) then begin
with StringGrid3 do
StringGrid3.Cells[x-4,Z] := FieldValues['KURZZEICHEN'];
end;
Next;
end;
end;
end;
Next;
end;
Z := Z+1;
end;
mxStatusBar1.Panels[3].ProgressBar.Position := 0;
end;

mkinzler 6. Mai 2008 15:54

Re: Problem mit UNION Select
 
SQL-Code:
select
    distinct p.persnr,
    first 1 d.datum as datum1,
    first 1 skip 1 d.datum as datum2,
    first 1 skip 2 d.datum as datum 3,
    ...
from
    tabelle2 p
        left join tabelle2 d on d.persnr = p.persnr;

mu8zeh 6. Mai 2008 21:01

Re: Problem mit UNION Select
 
es will einfach nicht

habe es nochmal mit der Union versucht

select temp2007.personalnr, temp2007.tag As dTAG, temp2007.kurzzeichen, temp2007.monat, temp2007.jahr, temp2007.memo from temp2007
union select 0, DummyDay ,0,0,0,0
from dummy

das ist die Fehlermeldung :gruebel:

Column does not belong to referenced table.
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid command.
Data type unknown.

Bekommt man hier Bilder rein? Dann könnte ich mal zeigen wie ich es bräuchte.

mkinzler 6. Mai 2008 21:06

Re: Problem mit UNION Select
 
Ja, man kann Bilder anhängen. Aber mit einem UNION kann man dein Problem nicht lösen.

mu8zeh 6. Mai 2008 21:17

Re: Problem mit UNION Select
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich verstehe nich, wieso Funktioniert das in Access(SQL) und in Delphi nicht?

Kennst Du noch weitere Möglichkeiten?

omata 6. Mai 2008 21:20

Re: Problem mit UNION Select
 
Zitat:

Zitat von mu8zeh
Für eine Ansicht in einem DBGrid brauche ich diese Daten aber nebeneinander.

PersNR|Datum|Datum|Datum >>> usw.

Aus deinen Ausführungen werde ich nicht wirklich schlau.

Schön das dich mkinzler versteht, aber vielleicht kannst du nochmal genauer erklären was du eigentlich haben möchtest.

- Was ist z.B. mit verschiedenen Monaten und Jahren?
- Wieso Datum neben Datum, sollte da nicht das Merkmal stehen?

Das das Access kann ist klar, das hat aber rein gar nichts mit SQL zu tun, dafür hat man dann OLAP erfunden. Aber das das Firebird nicht kann hat nichts mit Firebird zu tun, sowas musst du selber machen (in deiner Anwendung) oder zum Beispiel mit Excel als Pivot-Tabelle (und SQL-Abfrage im Hintergrund), dann müssen die Daten nämlich auch anders (nämlich in Zeilen) vorliegen, so wie das eine Datenbank kann und normalerweise liefert.

Ich weiss das dir das jetzt nicht weiterhilft, aber deine Aussagen sind einfach nicht präzise genug, um dir wirklich helfen zu können.

Edit: hier nochmal ein Vorschlag...
SQL-Code:
SELECT DISTINCT persnr, t1.merkmal AS t1, t2.merkmal AS t2, t3.merkmal AS t3
FROM tabelle2 x
LEFT JOIN tabelle2 t1
  ON    x.persnr = t1.persnr
     AND EXTRACT(DAY FROM t1.tag) = 1
LEFT JOIN tabelle2 t2
  ON    x.persnr = t2.persnr
     AND EXTRACT(DAY FROM t2.tag) = 2
LEFT JOIN tabelle2 t3
  ON    x.persnr = t3.persnr
     AND EXTRACT(DAY FROM t3.tag) = 3
:
:
Aber die eigentliche Frage bleibt: Was ist mit verschiedenen Monaten/Jahren?

Du must dich von der Vorstellung lösen, das du die Spalten einer Tabelle variable durch die Zeilen einer Tabelle abbilden/bestimmen kannst. Das hat nichts mit SQL zu tun!

Gruss
Thorsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:27 Uhr.
Seite 1 von 8  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz