Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: ottscho

ottscho (Level 2) - Jetzt verbinden

21.10.2009, aktualisiert 02.11.2009, 4749 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 ..
Ähnliche Inhalte
Datenbanken
SQL Abfrage aus mehreren Tabellen
gelöst Frage von el-torontoDatenbanken2 Kommentare

Hallo, auf dem Bild die vereinfachte Darstellung. Problematik: - Tabelle 1 enthält hunderte Kunden und wird mit Werten und ...

Datenbanken

SQL - Mehrere Tabellen über JOINS verketten

Frage von GwahlersDatenbanken1 Kommentar

Aktuell habe ich das Problem dass die Ausgabe von meinen Erwartungen abweicht JOINS und Tabellen im Anhang Folgende Abfrage ...

Datenbanken

SQL - Abfragen - Mehrere Tabellen - Problem WHERE-Filter

gelöst Frage von Andy1987Datenbanken12 Kommentare

Guten Morgen, ich muss mich derzeit mit SQL-Abfragen rumschlagen, um unsere Inventarisierung etwas Übersichtlicher zu gestallten. Mein Problem ist ...

Entwicklung

SQL Update aus derselben Tabelle

gelöst Frage von winscheilEntwicklung1 Kommentar

Hallo, ich habe folgendes Problem. Ich habe eine Tabelle die folgendermaßen aufgebaut ist. Auftrag Rechnung Position Artikel Kosten NULL ...

Neue Wissensbeiträge
Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 10 StundenGoogle Android3 Kommentare

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Sicherheit

Intel gibt neue Spectre V2-Microcode-Updates frei (20.02.2018)

Information von kgborn vor 11 StundenSicherheit

Intel hat zum 20. Februar 2018 weitere Microcode-Updates für OEMs freigegeben, um Systeme mit neueren Prozessoren gegen die Spectre ...

Microsoft
ARD-Doku - Das Microsoft Dilemma
Tipp von Knorkator vor 14 StundenMicrosoft3 Kommentare

Hallo zusammen, vor einigen Tagen lief in der ARD u.a. Reportage. Das Youtube Video dazu dürfte länger verfügbar sein. ...

Windows 10

Neue Sicherheitslücke in Windows 10 (Version 1709) durch Google öffentlich geworden

Information von kgborn vor 1 TagWindows 10

Vor ein paar Tagen haben Googles Sicherheitsforscher vom Projekt Zero eine Sicherheitslücke im Edge-Browser publiziert. Jetzt wurde eine weitere ...

Heiß diskutierte Inhalte
Windows Server
AD DS findet Domäne nicht, behebbar?
Frage von schapitzWindows Server40 Kommentare

Guten Tag, ich habe bei einem Kunden ein Problem mit den AD DS. Umgebung ist folgende: Windows Server 2016 ...

Router & Routing
LANCOM VPN CLIENT einrichten
Frage von Finchen961988Router & Routing27 Kommentare

Hallo, ich habe ein Problem und hoffe ihr könnt mir helfen, wir haben einen Kunden der hat einen Speedport ...

Router & Routing
ISC DHCP 2 Subnetze
gelöst Frage von janosch12Router & Routing19 Kommentare

Hallo, ich betreibe bei mir im Netzwerk einen ISC DHCP Server auf Debian, der DHCP verwaltet aktuell ein /24 ...

Switche und Hubs
Cisco SG350X-48 AdminIP in anderes VLAN
Frage von lcer00Switche und Hubs14 Kommentare

Hallo zusammen, ich habe ein Problem mir einem Cisco SG350X-48 bei der Erstinstallation wurde eine IP 192.168.0.254 (Default VLAN ...