Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi View's über 2 Tabellen und Kartesisches Produkt (https://www.delphipraxis.net/37618-views-ueber-2-tabellen-und-kartesisches-produkt.html)

Klaus D. 7. Jan 2005 23:01


View's über 2 Tabellen und Kartesisches Produkt
 
Moin
helft mir bitte mal auf die Sprünge !
ich habe 2 von einander getrennte Tabellen, möchte sie aber sinnvoll als Druckvorschau zusammenfassen.
..........
aus Tabelle 1 möchte ich alle Datensätze die im Monat 12.2004 angelegt wurden.
aus Tabelle 2 möchte ich auch alle Datensätze die im Monat 12.2004 angelegt wurden.

Ich möchte das mit nen 'VIEW' realisiern bekomme aber logischer Weise ein Kartesisches Produkt und ich habe kein Plan wie ich der Sache etwas näher komme.
Mfg ...Klaus :gruebel:

omata 8. Jan 2005 01:03

Re: View's über 2 Tabellen und Kartesisches Produkt
 
Moin,

benutze doch einen UNION...


SELECT *
FROM tabelle1
WHERE MONTH(datum) = 12
AND YEAR(datum) = 2004

UNION ALL

SELECT *
FROM tabelle2
WHERE MONTH(datum) = 12
AND YEAR(datum) = 2004


Beide Anweisungen müssen die gleichen Spalten haben.

Dies ist die Variante für den MSSQL-Server.

MfG
Thorsten

Klaus D. 8. Jan 2005 10:27

Re: View's über 2 Tabellen und Kartesisches Produkt
 
Moin mit SELECT ID..........klappt alles Danke!!!
Mein Problem ist nur,das es sich um 2 grund verschiedene Tabellen handel die einzige gemeinsamkeit ist halt 'ID'.
kann man so etwas überhaupt zusammenführen, um so mehr ich drüber nachdenke um so blödsinniger kommt es mit vor.
MfG...Klaus

Jelly 8. Jan 2005 10:46

Re: View's über 2 Tabellen und Kartesisches Produkt
 
Zitat:

Zitat von Klaus D.
Mein Problem ist nur,das es sich um 2 grund verschiedene Tabellen handel die einzige gemeinsamkeit ist halt 'ID'.

Dann sind die Daten ja auch nicht mehr in einer Tabelle rsp. View darstellbar. Macht für mich keinen Sinn, über union zu verfahren.

Vielleicht helfen dir Joins weiter.

jensw_2000 8. Jan 2005 10:57

Re: View's über 2 Tabellen und Kartesisches Produkt
 
Welche DB benutzt du ?

So könntest du es auch noach machen ...

angenommen aus Tabelle 1 willst du die Spalten Name, Vorname und Geburtstag
und aus Tabelle 2 willst du die Spalten Nachname, Vorname und geb_am
in einer Abtrage zusammenfassen ...



SQL-Code:
SELECT ID, Name, Vorname, Geburtstag as 'geboren am'
FROM tabelle1 
WHERE MONTH(datum) = 12 
AND YEAR(datum) = 2004 

UNION
SELECT Nachname as 'Name', Vorname, geb_am as 'geboren am'
FROM tabelle2 
WHERE MONTH(datum) = 12 
AND YEAR(datum) = 2004
[Edit]
Joins kommen in Frage wenn du in Tabelle 1 ID, Vormane und Nachname hast
und in Tabelle 2 ID, ID_Tabelle_1, Geburtstag und Geburtsort
und diese dann halt zusammenfassen möchtest
[/Edit]

Jelly 8. Jan 2005 11:05

Re: View's über 2 Tabellen und Kartesisches Produkt
 
Zitat:

Zitat von jensw_2000
angenommen aus Tabelle 1 willst du die Spalten Name, Vorname und Geburtstag
und aus Tabelle 2 willst du die Spalten Nachname, Vorname und geb_am
in einer Abtrage zusammenfassen ...

Die Annahme macht keinen Sinn, weil Klaus D. ja geschrieben hat, daß einzig die ID Spalte übereinstimmen. Ich bin davon ausgegangen, daß in den beiden Tabellen total grundverschiedene Informationen gespeichert sind. Deshalb dacht ich daß ein Union in dem Fall keinen Sinn macht.

jensw_2000 8. Jan 2005 11:10

Re: View's über 2 Tabellen und Kartesisches Produkt
 
@Jelly
Ich denke ich weis was er vor hat ... :mrgreen:

Tabelle 1 (Lohn):

ID_Auftrag, AuftragsDatum, Arbeitszeit, StundenVerrechnungssatz, Positionssumme

Tabelle 2 (Material):

ID_Auftrag, AuftragsDatum, Menge, EP, Positionssumme

Klaus D. 8. Jan 2005 11:19

Re: View's über 2 Tabellen und Kartesisches Produkt
 
es handelt sich um ADS-Tabellen
so...
//positive Einnahmen
Tabelle 1(bareinnahmen) :
-ID /AutoInc
-Rechnungsnummer /Character-setzt sich aus Teil des Datum und fortlaufender Nummer zusamen
-Datum /Date
-Betrag /Courdouble


//negative Einnahmen(laufende Kosten)
Tabelle 2(Ausgaben):
-ID /AutoInc
-Material /Character
-Datum /Date
-Betrag Courdouble

----------------------
ich möchte ganz einfach dem Anwender die Möglichkeit geben am Ende eines Monats alle Einnahmen und Ausgaben wie ein Kassenbuch auszudrucken oder als Monatliche Abrechnung zu speichern.

MfG...Klaus

gerade neu bearbeitet...Klaus

Jelly 8. Jan 2005 11:28

Re: View's über 2 Tabellen und Kartesisches Produkt
 
Zitat:

Zitat von Klaus D.
ich möchte ganz einfach dem Anwender die Möglichkeit geben am Ende eines Monats alle Einnahmen und Ausgaben wie ein Kassenbuch auszudrucken oder als Monatliche Abrechnung zu speichern.

Und wo ist die Betragsspalte? Wenn du uns die noch nennst, werden wir die View sicherlich zusammenkriegen

Klaus D. 8. Jan 2005 12:38

Re: View's über 2 Tabellen und Kartesisches Produkt
 
der Betrag befindet sich jeweils in der selben Tabelle.
"bitte keinen Vortrag über Normalisierung...u.s.w."ich versuche einzig mit den mir zur Verfügung stehenden Daten am Ende einen Report auf die Beine zu stellen.
MfG...Klaus

jensw_2000 8. Jan 2005 12:42

Re: View's über 2 Tabellen und Kartesisches Produkt
 
Code:
Hi Klaus,

soll das nachher so aussehen

Datum       Buchungstext       Betrag
---------------------------------------
01.01-2005   z.B. ReNr:         100,00
01.01.2005   Ausgabe 1234        -80,00

oder so ?

Datum       Buchungstext       Einnahme           Ausgabe
------------------------------------------------------------
01.01-2005   z.B. ReNr:         100,00
01.01.2005   Ausgabe 1234                             80,00

Klaus D. 8. Jan 2005 12:52

Re: View's über 2 Tabellen und Kartesisches Produkt
 
genau so.
sorry ich habe mit SQL nicht all zu viel Erfahrung
-------------------
Datum Buchungstext Einnahme Ausgabe
------------------------------------------------------------
01.01-2005 z.B. ReNr: 100,00
01.01.2005 Ausgabe 1234 80,00

MfG..Klaus

Jelly 8. Jan 2005 13:10

Re: View's über 2 Tabellen und Kartesisches Produkt
 
Na dann will ich mal probieren, ungetestet:
SQL-Code:
( select Datum, Rechnungsnummer as Buchungstext, Betrag as Einnahme from Tabelle1, null as Ausgabe
    where Month(Datum) = 12 and Year(Datum) = 2004
  union all
  select Datum, Material as Buchungstext, null as Einnahme, Betrag as Ausgabe
    where Month(Datum) = 12 and Year(Datum) = 2004
)

order by 1
Das mit der Month und Year Funktion ist Datenbankabhängig. Schlag dafür die Doku deiner Datenbank auf, da sollt sowas drin stehn. Oder nenn uns mal das System.

NULL kannst du auch durch 0 (Zahl null) ersetzen, je nach Belieben. Hätte dann den Vorteil daß du mit diesen Werten auch rechnen kannst. NULL z.B. macht unter MSSQL Probleme. Dinge wie sum(1+1+1+NULL) ergeben dort NULL, und nicht 3 wie vielleicht erwünscht... Probier einfach mal aus... Im Prinzip sollte die Abfrage jedoch so in der Art funktionieren.

Klaus D. 8. Jan 2005 13:37

Re: View's über 2 Tabellen und Kartesisches Produkt
 
Danke werd'gleich mal testen
MfG...Klaus :thumb:

Klaus D. 8. Jan 2005 15:25

Re: View's über 2 Tabellen und Kartesisches Produkt
 
2 Sachen verstehe ich nicht:'order by 1' wieso 1
'null as Einnahme' was ist null

kann man anstatt das Datum statisch vorzugeben auch Platzhalter nutzen ?
MfG...Klaus

Jelly 8. Jan 2005 16:11

Re: View's über 2 Tabellen und Kartesisches Produkt
 
Zitat:

Zitat von Klaus D.
2 Sachen verstehe ich nicht:'order by 1' wieso 1

in der order by Klausel steht die 1 für die erste Spalte. Du kannst hier nicht den Namen der Spalte angeben, da du ein Union von 2 Select Abfragen hast.

Zitat:

Zitat von Klaus D.
'null as Einnahme' was ist null

NULL steht quasi für leer. Da steht dann also nichts in der Spalte. Im Gegenzug steht 0 für die Zahl null. Das ist ein Unterschied.

Zitat:

Zitat von Klaus D.
kann man anstatt das Datum statisch vorzugeben auch Platzhalter nutzen ?

Was meinst du mit Platzhalter? Etwa die Params aus deiner Query. Also so wie
SQL-Code:
select ... where Month(Datum) = :Monat
Dann ist die klare Antwort ja, geht problemlos. Nur dran denken den Datentyp von :Monat als Integer zu nehmen.

Klaus D. 8. Jan 2005 16:18

Re: View's über 2 Tabellen und Kartesisches Produkt
 
gleich das nächste Problem
Code:
       SELECT ARBEITSDATUM as Datum
            , Rechnung_NR as Buchungstext
            , SUM(ZEIT * LOHN) AS Einnahmen
        FROM tbl_Rechnung
WHERE MONTH (ARBEITSDATUM ) = 01
    AND YEAR (ARBEITSDATUM ) = 2005

union all

       SELECT Datum
            , Material as Buchungstext
            , Einlagen AS Einnahmen
        FROM tbl_Kosten
WHERE MONTH (datum) = 01
    AND YEAR (datum) = 2005
Der Wert Lohn liegt in der Tabelle Rechnung nur als Schlüssel vor, der eigentliche Wert steht in der Tabelle Lohn.
Tabelle Rechnung:
sid_Lohn sek Schlüssel
Tabelle Lohn:
ID pr.Schlüssel
Lohn Datenfeld
ich wollte jetzt folgendes im ersten SELECT unterbringen klappt aber irgenwie nicht.
Code:
Inner JOIN  tbl_Lohn
        ON  tbl_Rechnung.SID_LOHN = tbl_Kosten.ID
MfG...Klaus
Ich hoffe ich nerve nicht all zu doll. :cheers:

Jelly 8. Jan 2005 16:23

Re: View's über 2 Tabellen und Kartesisches Produkt
 
Zeig mal deinen kompletten SQL Befehl, der nicht funktioniert.

jensw_2000 8. Jan 2005 16:26

Re: View's über 2 Tabellen und Kartesisches Produkt
 
Die schreibweise Order by 1 habe ich auch zur erstem mal gesehen. Ich denke es bedeutet Order by Datum (also Spalte 1).

Das Datum kann man durch Parameter ersetzen.
Schau dir das mal an ..SQL-Anfrage mit 2 Parametern

:hi:

omata 8. Jan 2005 16:45

Re: View's über 2 Tabellen und Kartesisches Produkt
 
Moin,

dann melde ich mich auch mal wieder...

Also ORDER BY 1 gibt an, dass nach der ersten Spalte sortiert werden soll.
Da beide Spalten Datum heissen kann hier auch ORDER BY datum stehen.
Es wird sowieso immer die erste SELECT-Anweisung ausgewertet, also wenn in der zweiten SELECT-Anweisung die erste Spalte anders heissen würde, würde die Angabe ORDER BY datum auch funktionieren (bei MSSQL)

AS ändert die Spaltenbezeichnung. Hier muss man allerdings aufpassen, die MsQuery (Officepaket) überliesst das AS und liefert einen Fehler. Dort muss man diese Namensänderung immer in eine Unterabfrage verschlieben.

Also einfach ein...

SELECT *
FROM (

eingentliche Abfrage

) x

MfG
Thorsten

Klaus D. 8. Jan 2005 17:09

Re: View's über 2 Tabellen und Kartesisches Produkt
 
Code:
SELECT ARBEITSDATUM as Datum
     , Rechnung_NR as Buchungstext
     , SUM(tbl_Rechnung.ZEIT * tbl_Lohn.LOHN) AS Einnahmen
  FROM tbl_Rechnung

Inner JOIN  tbl_Lohn
        ON  tbl_Rechnung.SID_LOHN = tbl_Lohn.ID

WHERE MONTH (ARBEITSDATUM ) = 01
   AND YEAR (ARBEITSDATUM ) = 2005

union all
SELECT Datum
     , Material as Buchungstext
     , Einlagen as Einnahmen
  FROM tbl_Kosten
WHERE MONTH (datum) = 01
   AND YEAR (datum) = 2005
ohne SUM und Join klappt alles

MfG...Klaus
Ps: nicht das ihr denkt ich mach es mir hir aber einfach,habe hir 3Bücher zu liegen(nur SQL).
aber die besten Antworten finde ich halt im Forum. Danke

Jelly 8. Jan 2005 17:17

Re: View's über 2 Tabellen und Kartesisches Produkt
 
Da Sum eine Aggregat-Funktion ist, mußt du nach den restlichen Feldern gruppieren:
SQL-Code:
SELECT ARBEITSDATUM as Datum
     , Rechnung_NR as Buchungstext
     , SUM(tbl_Rechnung.ZEIT * tbl_Lohn.LOHN) AS Einnahmen
  FROM tbl_Rechnung

Inner JOIN  tbl_Lohn
        ON  tbl_Rechnung.SID_LOHN = tbl_Lohn.ID

WHERE MONTH (ARBEITSDATUM ) = 01 
   AND YEAR (ARBEITSDATUM ) = 2005 
GROUP BY Datum, Rechnung_NR

union all
SELECT Datum
     , Material as Buchungstext
     , Einlagen as Einnahmen
  FROM tbl_Kosten
WHERE MONTH (datum) = 01 
   AND YEAR (datum) = 2005

Klaus D. 9. Jan 2005 15:12

Re: View's über 2 Tabellen und Kartesisches Produkt
 
Ich noch mal...Hallo
bin nun tüchtig am SQL üben.
folgenden Versuch:
Code:
SELECT RE.Arbeitsdatum_Von
      ,RE.Arbeitsdatum
      ,RE.Rechnung_Nr
      ,RE.Man_Leistung
      ,RE.Man_Leistung_Memo
      ,RE.Zeit
      ,RE.Preis
      ,LE.Leistung
      ,SUM(Zeit * Preis) as Gesamt
  FROM  tbl_Rechnung RE

 Inner JOIN  tbl_Leistung LE
         ON  RE.SID_Leistung = LE.ID

      WHERE  RE.SID_Rechnung_NR =:ID
klappt natürlich nicht. muß ich wieder mit GROUP BY arbeiten? und wo muß es eigentlich stehen
MfG...Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 Uhr.

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