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

Frage Entwicklung Datenbanken

GELÖST

Zwei Selects in einem Select berechnen und verrechnen

Mitglied: EricAG3

EricAG3 (Level 1) - Jetzt verbinden

13.08.2013 um 10:24 Uhr, 2622 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 ..
Ähnliche Inhalte
Datenbanken
Select Statement
gelöst Frage von pauls1Datenbanken4 Kommentare

Hallo, ich bin neu hier im Forum und habe schon gleich folgende Frage. Und zwar habe zwei Tabellen ('post' ...

Batch & Shell
Powershell Select
gelöst Frage von shwatsonBatch & Shell5 Kommentare

Hallo Community! Zu meinem Problem, ich habe mir ps1 und eine txt Datei erstellt, und versuche nun mit der ...

Datenbanken
SELECT DISTINCT nur für eines der Felder in der Abfrage?
gelöst Frage von AdminKnechtDatenbanken5 Kommentare

Hallo, da ich nicht der DB-Guru bin und eine Abfrage erstellen muss hänge ich hier: Das Dataset sieht momentan ...

Datenbanken
Passende SELECT-Abfrage gesucht
gelöst Frage von DonChuniorDatenbanken8 Kommentare

Hallo liebe Datenbank-Admins, ich habe diese Frage bereits in einem anderen Forum gestellt. Da sich dort aber überwiegend CAD-Anwender ...

Neue Wissensbeiträge
Router & Routing

PfSense als Addon auf QNAP

Information von magicteddy vor 4 StundenRouter & Routing1 Kommentar

Moin, für Spielereien eine ganz nette Idee aber ich fürchte das soetwas auch als echte Firewall genutzt wird: In ...

Datenschutz

Teamviewer kommt für IoT-Geräte wie den Raspberry Pi

Information von magicteddy vor 11 StundenDatenschutz

Moin, jetzt werden IoT Geräte endgültig zur Wanze? Anscheinend kann man auf einem Dashboard seine Geräte visualisieren Ich stelle ...

Microsoft

Letzte Updates für Win10 und Server2016 müssen bei Bedarf über den Update catalogue in den WSUS importiert werden!

Tipp von DerWoWusste vor 15 StundenMicrosoft1 Kommentar

automatisch kommt da nichts an im WSUS und auch nicht im SCCM. Siehe Hinweise zum Bezug der jeweils neuesten ...

Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 3 TagenLinux

Meltdown (Variante 3 des Prozessorfehlers) Der Kernel 4.14.13 mit den Page-Table-Isolation-Code (PTI) ist nun für Fedora freigegeben worden. Er ...

Heiß diskutierte Inhalte
Netzwerkmanagement
Preis für Wartungsvertrag ok?
gelöst Frage von a-za-zNetzwerkmanagement22 Kommentare

Hallo! Mal ne Frage, weil ich mich mit dem akzeptablen Preis für einen Reaktionszeitvertrag nicht auskenne. Meine Firma hat ...

Windows Netzwerk
Ist ein Portforwarding auf einen PC ohne lauschendes Programm ein (großes) Sicherheitsproblem?
Frage von PluwimWindows Netzwerk13 Kommentare

Hallo zusammen, zur Fernwartung eines Rechners an einem anderen Ort nutze ich VNC. Da dieser Rechner einfach nur eine ...

Windows Server
Terminal Server 2016 erkennt Berechtigungen nicht
gelöst Frage von Thomas2Windows Server10 Kommentare

Hallo Administratoren, folgendes Problem stellt sich dar: Es gibt zwei Windows Server 2016, die als Terminal Server fungieren. Jetzt ...

Sonstige Systeme
7-zip: Programm frägt nach Passwort erst bei einzelnen Dateien
Frage von freeskierchrisSonstige Systeme7 Kommentare

Guten Morgen, ich habe ein Problem beim Arbeiten mit 7-zip: Wenn ich die einzelnen Dateien zu einem Archiv verpacke ...