Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

SQL Statment über mehrere Tabellen

Frage Entwicklung Datenbanken

Mitglied: ottscho

ottscho (Level 2) - Jetzt verbinden

21.10.2009, aktualisiert 02.11.2009, 4707 Aufrufe, 15 Kommentare

Hallo zusammen,

ich habe 2 Tabellen, welche ich vergleichen möchte. In einer Tabelle sind Aufträge, Kundennummer und Datum und in der Anderen Angebote, Kundennummer und Datum.
Nun möchet ich Pro Kundennummer die Angebote und Aufträge in einem bestimmten Zeitraum gegenüberstellen.

so z.b.

Datensatzspalte / AngeboteAnzahl / AuftragAnzahl
Datensatz1 / 1 / 1
Datensatz2 / 1 / 2
Datensatz3 / 0 / 1
Datensatz4 / 1 / 0

Mit diesem SQL Statment mache ich es zur Zeit, aber sobald in einer Tabelle ein Count mit 0 ist, wird die komplette Zeile verworfen.
Ich komme einfach nicht drauf, wie es gehen könnte...

01.
select	account.accountnumber,account.name, an.AngebotAnzahl, au.AuftragAnzahl  
02.
from	(  
03.
	select	new_parentaccountid, count (*) As AngebotAnzahl  
04.
	from	new_offer   
05.
	group by new_parentaccountid) an  
06.
	join (  
07.
	select	new_parentaccountid, count (*) As AuftragAnzahl  
08.
	from	new_order 
09.
	group by new_parentaccountid) au on an.new_parentaccountid = au.new_parentaccountid 
10.
join account on an.new_parentaccountid = account.accountid

Vllt habt ihr mir noch einen Tipp.

Vielen Dank
Mitglied: nxclass
21.10.2009 um 08:18 Uhr
... so ?
01.
SELECT 
02.
    a.accountnumber, 
03.
    a.name, 
04.
    an.AngebotAnzahl, 
05.
    au.AuftragAnzahl  
06.
FROM 
07.
    `account` a 
08.
        LEFT JOIN (  
09.
            SELECT `new_parentaccountid`, COUNT(*) As 'AngebotAnzahl' 
10.
            FROM `new_offer` 
11.
            GROUP BY `new_parentaccountid` 
12.
        ) an ON a.accountid = an.new_parentaccountid 
13.
        LEFT JOIN (  
14.
            SELECT `new_parentaccountid`, COUNT(*) As 'AuftragAnzahl'  
15.
            FROM `new_order` 
16.
            GROUP BY `new_parentaccountid` 
17.
        ) au ON a.accountid = au.new_parentaccountid 
18.
ORDER BY a.name;
oder so ?
01.
SELECT 
02.
    a.accountnumber, 
03.
    a.name, 
04.
    COUNT(an.new_parentaccountid) AS 'AngebotAnzahl', 
05.
    COUNT(au.new_parentaccountid) AS 'AuftragAnzahl'  
06.
FROM 
07.
    `account` a 
08.
        LEFT JOIN `new_offer` an ON a.accountid = an.new_parentaccountid 
09.
        LEFT JOIN `new_order` au ON a.accountid = au.new_parentaccountid 
10.
GROUP BY a.accountnumber 
11.
ORDER BY a.name;
Bitte warten ..
Mitglied: ottscho
21.10.2009 um 08:31 Uhr
ja, das sieht jetzt schon sehr gut aus.
Und wenn ich jetzt noch die Anzahl der Firmen begrenzen wollte, müsste ich unten noch ein WHERE reinmachen, dass ich nicht alle Datensätze von ACCOUNT bekomme, sondern nur von bestimmen Firmen.

Das sollte gehen

Ich probiere es mal aus.

Danke erst mal
Bitte warten ..
Mitglied: ottscho
02.11.2009 um 13:49 Uhr
Hallo,
ich verusche gerade die selbe Abfrage auf einer anderen Datenbank:

01.
SELECT	WDKDSTAM.KKDNR, 
02.
WDKDSTAM.KNAME1, 
03.
DK.DK_Anzahl, 
04.
ML.ML_Anzahl 
05.
FROM	WDKDSTAM 
06.
    LEFT JOIN ( 
07.
        SELECT KLKDNR, count(KLKDNR) AS DK_Anzahl 
08.
        FROM WDKALKULATION 
09.
        WHERE KLDATE between '01.11.2009' and '30.11.2009' 
10.
        AND KLPGR = 'DK' 
11.
        GROUP BY KLKDNR 
12.
    ) DK ON WDKDSTAM.KKDNR = DK.KLKDNR 
13.
    LEFT JOIN ( 
14.
        SELECT KLKDNR, count(KLKDNR) AS ML_Anzahl 
15.
        FROM WDKALKULATION 
16.
        WHERE KLDATE between '01.11.2009' and '30.11.2009' 
17.
        AND KLPGR = 'ML' 
18.
        GROUP BY KLKDNR 
19.
    ) ML ON WDKDSTAM.KLDKDNR = ML.KLKDNR;
Leider bekomme ich einen Fehler in der Zeile 7, beim select?
Wenn ich das Select alleine abfrage funktioniert es aber...

Weiß jmd die Lösung?
Bitte warten ..
Mitglied: nxclass
02.11.2009 um 20:03 Uhr
versuch mal:
01.
SELECT 
02.
    wdks.KKDNR, 
03.
    wdks.KNAME1, 
04.
    count(wdk1.KLKDNR) AS DK_Anzahl, 
05.
    count(wdk2.KLKDNR) AS ML_Anzahl 
06.
FROM 
07.
    WDKDSTAM wdks 
08.
        LEFT JOIN WDKALKULATION wdk1 ON wdks.KKDNR = wdk1.KLKDNR 
09.
        LEFT JOIN WDKALKULATION wdk2 ON wdks.KKDNR = wdk2.KLKDNR 
10.
WHERE 
11.
    wdk1.KLDATE BETWEEN '01.11.2009' AND '30.11.2009' AND 
12.
    wdk1.KLPGR = 'DK' AND 
13.
    wdk2.KLDATE BETWEEN '01.11.2009' AND '30.11.2009' AND 
14.
    wdk2.KLPGR = 'ML' 
15.
GROUP BY 
16.
    wdk1.KLKDNR, 
17.
    wdk2.KLKDNR
... einige Datenbanken verstehen nicht die verschachtelten SELECT Anweisungen.
Bitte warten ..
Mitglied: ottscho
03.11.2009 um 07:50 Uhr
Danke für die Hilfe.
Leider geht dieser Code auch nicht.

Fehler:
invalid column reference
Bitte warten ..
Mitglied: nxclass
03.11.2009 um 08:41 Uhr
mit was für einer Datenbank arbeitest Du?

01.
SELECT wdks.*, wdk1.*, wdk2.* 
02.
FROM 
03.
    WDKDSTAM wdks 
04.
        LEFT JOIN WDKALKULATION wdk1 ON wdks.KKDNR = wdk1.KLKDNR 
05.
        LEFT JOIN WDKALKULATION wdk2 ON wdks.KKDNR = wdk2.KLKDNR 
06.
WHERE 
07.
    wdk1.KLDATE BETWEEN '01.11.2009' AND '30.11.2009' AND 
08.
    wdk1.KLPGR = 'DK' AND 
09.
    wdk2.KLDATE BETWEEN '01.11.2009' AND '30.11.2009' AND 
10.
    wdk2.KLPGR = 'ML'
...geht das ?

kann deine DB den Befehl 'CREATE TEMPORARY TABLE ... SELECT' ?
Bitte warten ..
Mitglied: ottscho
03.11.2009 um 08:58 Uhr
NEIN, TEMPRARY wird nicht erkannt. Aber man könnte evtl. eine VIEW machen.

Ich arbeite mit Borland Interbase SQL 6
Bitte warten ..
Mitglied: nxclass
03.11.2009 um 11:29 Uhr
dann mache doch 2 VIEWs:
01.
SELECT KLKDNR, count(KLKDNR) AS DK_Anzahl 
02.
FROM WDKALKULATION 
03.
WHERE KLDATE between '01.11.2009' and '30.11.2009' AND KLPGR = 'DK' 
04.
GROUP BY KLKDNR;
und
01.
SELECT KLKDNR, count(KLKDNR) AS ML_Anzahl 
02.
FROM WDKALKULATION 
03.
WHERE KLDATE between '01.11.2009' and '30.11.2009' AND KLPGR = 'ML' 
04.
GROUP BY KLKDNR
und über diese beiden VIEWs dann den SELECT
01.
SELECT 
02.
    wdks.KKDNR, 
03.
    wdks.KNAME1, 
04.
    v1.KLKDNR AS DK_Anzahl, 
05.
    v2.KLKDNR AS ML_Anzahl 
06.
FROM 
07.
    WDKDSTAM wdks 
08.
        LEFT JOIN { VIEW 1 } v1 ON wdks.KKDNR = v1.KLKDNR 
09.
        LEFT JOIN { VIEW 2 } v2 ON wdks.KKDNR = v2.KLKDNR
---

... leider kenne ich das Borland Interbase SQL 6 nicht.
Bitte warten ..
Mitglied: Biber
03.11.2009 um 11:58 Uhr
Moin nxclass,

der Workaround über die Views hat den immensen Nachteil, dass in jedem dieser Views hart verdrahtet eine feste WHERE-Clause codiert ist.
Das WHERE bezogen auf die Kategorie KLPGR (mit "ML" oder "DK") ist ja dort gut aufgehoben.
Aber der Verzicht auf jegliche Flexibilität durch das Einmeisseln von "WHERE KLDATE Between '1.11.2009' and '30.11.2009'" wäre für mich ein Killerkriterium. No way.

@ottscho

lass uns nochmal zurück zu deinem Post von 2.11.
Leider bekomme ich einen Fehler in der Zeile 7, beim select?
Welchen genau?

Wenn ich das Select alleine abfrage funktioniert es aber...
kannst du das mal in zwei ganzen Sätzen beschreiben? Welche Selects, welches Ergebnis?

Grüße
Biber
Bitte warten ..
Mitglied: ottscho
03.11.2009 um 12:10 Uhr
01.
SELECT	WDKDSTAM.KKDNR, 
02.
WDKDSTAM.KNAME1, 
03.
DK.DK_Anzahl, 
04.
ML.ML_Anzahl 
05.
FROM	WDKDSTAM 
06.
    LEFT JOIN ( 
07.
        SELECT KLKDNR, count(KLKDNR) AS DK_Anzahl 
08.
        FROM WDKALKULATION 
09.
        WHERE KLDATE between '01.11.2009' and '30.11.2009' 
10.
        AND KLPGR = 'DK' 
11.
        GROUP BY KLKDNR 
12.
    ) DK ON WDKDSTAM.KKDNR = DK.KLKDNR 
13.
    LEFT JOIN ( 
14.
        SELECT KLKDNR, count(KLKDNR) AS ML_Anzahl 
15.
        FROM WDKALKULATION 
16.
        WHERE KLDATE between '01.11.2009' and '30.11.2009' 
17.
        AND KLPGR = 'ML' 
18.
        GROUP BY KLKDNR 
19.
    ) ML ON WDKDSTAM.KLDKDNR = ML.KLKDNR;
Fehler:
Dynamic SQL Error
SQL error code = -104
Token unknown - liine 7, char7
SELECT

Wenn ich diesen Code alleine ausführe:
01.
SELECT KLKDNR, count(KLKDNR) AS DK_Anzahl 
02.
        FROM WDKALKULATION 
03.
        WHERE KLDATE between '01.11.2009' and '30.11.2009' 
04.
        AND KLPGR = 'DK' 
05.
        GROUP BY KLKDNR
funktioniert es...
Bitte warten ..
Mitglied: Biber
03.11.2009 um 18:02 Uhr
Moin ottscho,

der SQLCode -104 ist eigentlich immer derjenige für "ILLEGAL STRING"..

Kann es sein, dass du beim Zusammenbraten des Select-Statements eventuell KEIN Leerzeichen zwischen dem "ML.ML_Anzahl" in Zeile 04 und dem "From WKKDSTAM" in Zeile 05 stehen hast?
Hast Du die Möglichkeit, dieses Statement als Copy & Paste-Kopie direkt über irgendeine Client-Workbench abzufeuern?
Bzw. wo kommt denn die Erwähnung des "DYNAMIC SQL" in der Fehlermeldung her? Wer bastelt denn den Statementstring wie zusammen?

Grüße
Biber
Bitte warten ..
Mitglied: ottscho
04.11.2009 um 08:03 Uhr
Morgen,

also ein Leerzeichen ist vorhanden, das habe ich eben überprüft.
Das Statment schicke ich über den Borland IBAdmin3 direkt an die DB.
Der Fehler kommt auch von diesem Programm, siehe Screenshot:

http://www.myimg.de/?img=screenshot4ec71.jpg
Bitte warten ..
Mitglied: Biber
04.11.2009 um 09:47 Uhr
Moin ottscho,

tjy, das macht mich auch etwas ratlos.

Letzter Versuch meinerseits (allerdings gebe ich diesem Versuch auch nur eine Erfolgschance von 5%):

01.
SELECT	WDKDSTAM.KKDNR, 
02.
WDKDSTAM.KNAME1, 
03.
DK.DK_Anzahl, 
04.
ML.ML_Anzahl 
05.
FROM	WDKDSTAM 
06.
    LEFT JOIN ( 
07.
        SELECT a.KLKDNR, count(a.KLKDNR) AS DK_Anzahl 
08.
        FROM WDKALKULATION a 
09.
        WHERE a.KLDATE between '01.11.2009' and '30.11.2009' 
10.
        AND a.KLPGR = 'DK' 
11.
        GROUP BY a.KLKDNR  
12.
    ) DK ON WDKDSTAM.KKDNR = DK.KLKDNR 
13.
    LEFT JOIN ( 
14.
        SELECT b.KLKDNR, count(b.KLKDNR) AS ML_Anzahl 
15.
        FROM WDKALKULATION b 
16.
        WHERE b.KLDATE between '01.11.2009' and '30.11.2009' 
17.
        AND b.KLPGR = 'ML' 
18.
        GROUP BY b.KLKDNR  
19.
    ) ML ON WDKDSTAM.KLDKDNR = ML.KLKDNR;
Keine Ahnung, wieso deine DB sich da so ziert... exotisch ist eigentlich nichts an deinem Statement laut Screenshot.

Grüße
Biber
Bitte warten ..
Mitglied: ottscho
04.11.2009 um 10:12 Uhr
Hallo Biber,

danke für deine Mühen.
Ich habe nun im IBAdmin3 keine Änderung. Fehler bleibt erhalten.
Zum Tst habe ich mal in Excel die Datebank per ODBC und Microsoft SQL Query eingebunden und hier das Statment versucht.
Auch keine Erfolg.
Die Fehlermeldung ist gleich!

Gruß
ottscho
Bitte warten ..
Mitglied: nxclass
04.11.2009 um 10:35 Uhr
... den immensen Nachteil, dass in jedem dieser Views hart verdrahtet eine feste WHERE-Clause codiert ist ...

und wenn Er an der Stelle nur ein Feld mit 'Monat-Jahr' generiert und dieses Feld in die GROUP -Klausel einfügt - sollte es doch flexibel genug sein um in der Abfrage danach zu Filtern (WHERE).
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Datenbanken
gelöst Schleifen in SQL-Abfrage bei 2 Tabellen (2)

Frage von Aximand zum Thema Datenbanken ...

Datenbanken
gelöst SQL - mehrere UPDATE-Anweisungen in einem String per vbs (4)

Frage von goodbytes zum Thema Datenbanken ...

Datenbanken
gelöst SQL-Abfrage - DISTINCT - letztes Datum (3)

Frage von emeriks zum Thema Datenbanken ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...