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

Zwei Selects in einem Select berechnen und verrechnen

Frage Entwicklung Datenbanken

Mitglied: EricAG3

EricAG3 (Level 1) - Jetzt verbinden

13.08.2013 um 10:24 Uhr, 2415 Aufrufe, 15 Kommentare, 3 Danke

Wieso funktioniert folgender Select nicht? Es kann nur eine Kleinigkeit sein... Danke!

select eins / zwei

from

(select count(*) as eins from tabelle where 'Kanten SOLL' = 'Kanten IST' and 'Kanten SOLL' between '29.07.2013' and '02.08.2013'),

(select count(*) as zwei from tabelle where 'Kanten SOLL' between '29.07.2013' and '02.08.2013');

Fehlertext:
Meldung 102, Ebene 15, Status 1, Zeile 6
Falsche Syntax in der Nähe von ','.


(Microsoft SQL)
Mitglied: AndreasHoster
13.08.2013, aktualisiert um 11:21 Uhr
Abgesehen davon, daß ich bei Spaltennamen mit Leerzeichen graue Haare bekomme und der SQL Server ein Datum vermutlich in einem anderen Format haben will, fangen wir doch mal mit den Grundlagen der Fehlersuche an:

Wenn ein verknüpftes Statement nicht tut, verifiziert man zuerst einmal, ob die zugrundeliegenden Statements funktionieren.
D.h. funktionieren die Selects einzeln? Und tun Sie das, was sie sollen?
select count(*) as eins from tabelle where 'Kanten SOLL' = 'Kanten IST' and 'Kanten SOLL' between '29.07.2013' and '02.08.2013'
und
select count(*) as zwei from tabelle where 'Kanten SOLL' between '29.07.2013' and '02.08.2013'

Und wenn Sie nicht tun, vereinfacht man das Statement, um zu sehen wo der Fehler liegt.
Also was macht:
select count(*) as eins from tabelle where 'Kanten SOLL' = 'Kanten IST'
und könnte das Ergebnis stimmen?

Und was das Datumsformat angeht, aus dem Technet:
Wir empfehlen, Datums- und Zeitformate zu verwenden, die nicht von DATEFORMAT abhängen und mehrere Sprachen unterstützen. Die ISO 8601-Formate "1998-02-23T14:23:05" und "1998-02-23T14:23:05 -08:00" sind die einzigen Formate, die als internationaler Standard gelten. Sie sind nicht von DATEFORMAT oder der bei der Anmeldung angegebenen Standardsprache abhängig und unterstützen mehrere Sprachen.
Bitte warten ..
Mitglied: LianenSchwinger
13.08.2013, aktualisiert um 11:28 Uhr
Hallo,

unabhängig von dem was Andreas schon schrieb, müsste das ganze auch so zu lösen sein.

01.
SELECT CASE 'Kanten SOLL' WHEN 'Kanten IST' THEN COUNT(*) END / COUNT(*) 
02.
FROM tabelle 
03.
WHERE 'Kanten SOLL' BETWEEN '29.07.2013' AND '02.08.2013'
G Jörg
Bitte warten ..
Mitglied: Biber
13.08.2013 um 12:07 Uhr
Moin,

Ergänzend zu den Vor-Postern:

.... drittens müssten die Spalten-Aliasnamen "as eins" und "as zwei" jeweils hinter der schliessenden Klammer des Inline-SELECTs stehen.

Ist das wirklich schon ein SQL-Server oder doch irgendeine Access 2.0-Anwendung, die ihr da zusammentrümmert?

Grüße
Biber
Bitte warten ..
Mitglied: EricAG3
13.08.2013 um 12:27 Uhr
@andreas:
Die selects funktionieren einzeln und liefern ganze Zahlen zurück.
@lianen:
Fehlertext mit Deinem Select:
Meldung 8120, Ebene 16, Status 1, Zeile 2
Die 'tabelle.Kanten SOLL'-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.

ps.: Ich bin nicht der DB Admin.
Bitte warten ..
Mitglied: MadMax
13.08.2013 um 13:00 Uhr
Moinmoin,

also erstmal das select von EricAG3: da fehlt hinter den beiden Unterabfragen einfach nur ein Alias:
01.
select eins / zwei 
02.
from 
03.
(select count(*) as eins from tabelle where [Kanten SOLL] = [Kanten IST] and [Kanten SOLL] between '29.07.2013' and '02.08.2013') AS A, 
04.
(select count(*) as zwei from tabelle where [Kanten SOLL] between '29.07.2013' and '02.08.2013') AS B;
Die implizite Umwandlung des Datums funktioniert zwar normalerweise, aber besser wäre es natürlich, es explizit per cast oder convert ins Datumsformat zu bringen.

Der Ansatz von LianenSchwinger würde mit einer kleinen Änderung auch funktionieren:
01.
SELECT SUM (CASE [Kanten SOLL] WHEN [Kanten IST] THEN 1 ELSE 0 END) / COUNT(*) 
02.
FROM tabelle 
03.
WHERE [Kanten SOLL] BETWEEN '29.07.2013' AND '02.08.2013'
Im Übrigen sollte man bei Divisionen auch immer prüfen, ob der Nenner 0 ist.

Gruß, Mad Max
Bitte warten ..
Mitglied: Biber
13.08.2013, aktualisiert um 13:02 Uhr
Probier mal so:


01.
select sum(eins) /count(*) as whatever from ( 
02.
SELECT CASE 'Kanten SOLL' 
03.
    WHEN 'Kanten IST' THEN 1  
04.
    ELSE 0  
05.
  END as eins 
06.
FROM tabelle 
07.
WHERE 'Kanten SOLL' BETWEEN '29.07.2013' AND '02.08.2013' 
08.
09.
;
Gruß
Biber
Bitte warten ..
Mitglied: LianenSchwinger
13.08.2013, aktualisiert um 13:09 Uhr
... ups, sorry mein Fehler

01.
SELECT SUM(CASE 'Kanten SOLL' WHEN 'Kanten IST' THEN 1 END) / COUNT(*)  
02.
FROM tabelle  
03.
WHERE 'Kanten SOLL' BETWEEN '29.07.2013' AND '02.08.2013';
G Jörg

OK MadMax war schneller
Bitte warten ..
Mitglied: EricAG3
13.08.2013 um 13:27 Uhr
Vielleicht mal als Hintergrundinfo.
Der select dient zur Berechnung der Liefertreue. Pünktlich geliefert bedeutet Soll Datum = Ist Datum.
Die Summe aller pünktlichen Aufträge soll durch die Gesamtanzahl der Aufträge dividiert werden um eine prozentuale Liefertreue zu erhalten.

Führe ich die selects einzeln aus erhalte ich:

Select 1 (Anzahl pünktlich geliefertet Aufträge) Rückgabewert = 15
select count(*) as eins from tabelle where "Kanten SOLL" = "Kanten IST" and "Kanten SOLL" between '29.07.2013' and '02.08.2013';

Select 2 (Gesamtanzahl der Aufträge) Rückgabewert = 52
select count(*) as zwei from tabelle where "Kanten SOLL" between '29.07.2013' and '02.08.2013';

Ergibt eine Liefertreue von 29% (15/52*100).

Eure Vorschläge habe ich ausprobiert und sie funktionieren, rein technisch. Das Ergebnis ist falsch, er gibt die Zahl 0 aus.
Bitte warten ..
Mitglied: MadMax
13.08.2013 um 14:02 Uhr
Du hast nur die Lösungen von Biber und LianenSchwinger ausprobiert, die geben natürlich 0 aus. Wenn [Kanten SOLL] und [Kanten IST] statt mit eckigen Klammern oder doppelten Anführungszeichen mit einfachen Anführungszeichen umschlossen werden, sind es keine Spaltennamen, sondern Zeichenfolgen. Folglich ergibt
01.
CASE 'Kanten SOLL' WHEN 'Kanten IST' THEN 1 ELSE 0 END
immer 0 bzw. ohne ELSE NULL, weil die Zeichenfolgen eben nicht gleich sind.

Gruß, Mad Max
Bitte warten ..
Mitglied: AndreasHoster
13.08.2013 um 14:45 Uhr
Unsere Vorschläge haben sich genau auf das bezogen, was du gepostet hast, in Deinem Posting stehen die Spaltennamen mit einem einfachen Anführungszeichen, Deine jetzt oben geposteten mit doppelten Anführungszeichen.
Das macht einen Unterschied, wie Mad Max schon festgestellt hat. Und wir gehen hier davon aus, das man die Statements per Copy & Paste ins Posting packt und damit in Deinem Original auch einfache Anführungszeichen drin sind.
Aber der Vorschlag von Mad Max sollte doch eigentlich tun, was kommt bei dem denn?
Bitte warten ..
Mitglied: EricAG3
13.08.2013 um 15:02 Uhr
Mit "" (doppelte Anführungszeichen gibt es den Rückgabewert 0.

Mit ' (einfach A.) gibt es den Rückgabewert NULL.

Von MadMax:

SELECT SUM (CASE [Kanten SOLL] WHEN [Kanten IST] THEN 1 ELSE 0 END) / COUNT(*)

FROM tabelle

WHERE [Kanten SOLL] BETWEEN '29.07.2013' AND '02.08.2013';

--> Rückgabewert 0.
Bitte warten ..
Mitglied: MadMax
13.08.2013 um 15:57 Uhr
Tja, peinlich, das lerne ich in diesem Leben wahrscheinlich nicht mehr: zwei int-Werte dividiert ergibt wieder int. Also muß Zähler oder Nenner in float oder dec o.ä. konvertiert werden:
01.
SELECT SUM (CASE [Kanten SOLL] WHEN [Kanten IST] THEN 1 ELSE 0 END) / convert (float, COUNT(*)) 
02.
FROM tabelle 
03.
WHERE [Kanten SOLL] BETWEEN '29.07.2013' AND '02.08.2013'
Wenns jetzt nicht paßt geb ich auf.

Gruß, Mad Max
Bitte warten ..
Mitglied: EricAG3
13.08.2013 um 16:16 Uhr
super, ergebnis passt jetzt, danke!
Bitte warten ..
Mitglied: EricAG3
13.08.2013 um 16:22 Uhr
kurze frage noch:
kann man den select noch irgendwie einfacher gestalten? gerade dieses konvertieren in float verstehe ich nicht, wieso war das nötig?
und geht es nicht indem man die zwei von mir erstellen selects irgendwie hintereinander abfragt? dann wären wir näher an meiner lösung...
Bitte warten ..
Mitglied: Biber
13.08.2013, aktualisiert um 18:52 Uhr
Moin EricAG3,

Zitat von EricAG3:
kurze frage noch:
kann man den select noch irgendwie einfacher gestalten?
Das Statement IST einfacher als dein Ansatz - schau nochmal hin.

gerade dieses konvertieren in float verstehe ich nicht, wieso war das nötig?
Das wurde gerade erklärt - eine Ganzzahl ( Beispiel: 15) geteilt durch eine andere Ganzzahl (Beispiel 52) ergibt wieder eine Ganzzahl.
Also nicht einen Wert "0,28763", sondern nur den ganzzahligen Teil--> 0.


und geht es nicht indem man die zwei von mir erstellen selects irgendwie hintereinander abfragt?
dann wären wir näher an meiner lösung...
Und weiter? Was ist erstrebenswert daran, für das Anzeigen EINES Wertes ZWEIMAL einen Count(*) mit derselben WHERE-Clause auf dieselbe Tabelle zu machen?
Hast du in irgendwelche QuadCore-Aktien investiert oder meinst du, wir sollten rumprassen, solange wir jung sind?

Abgesehen davon - die Länge oder Kürze eines Select-Statements sagt wenig aus über Effizienz, Performanz und Wartbarkeit.
Dennoch ist das erste Statement/dein Lösungsansatz doch wohl tippfehlerträchtiger (alle Feld-/Tabellennamen+Parameter müssen an zwei Stellen angepasst werden) und wirklich bei einer Tabelle mit mehr als 50 Sätzen bestimmt auch nicht performanter.

Auch nicht bei 5 Sätzen.

Ach ja, und wenn du das CASTen auf float nicht magst: du brauchst ja nur in der Rechnung eine Nicht-Ganzzahl mit einbauen.

... Select ..(sum(eins) * 100.00 /count(*) ) as LieferTroieInProzent

Grüße
Biber
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Netzwerke
HTTP Overhead Berechnen und Protokolstack

Frage von karlosss zum Thema Netzwerke ...

Festplatten, SSD, Raid
Speicher der nächsten Jahre berechnen (10)

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

Datenbanken
Mit sql eine Zeile einfügen, select und feste Werte (9)

Frage von helmuthelmut2000 zum Thema Datenbanken ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...