SQL Statement...Was ist falsch?

Hallo.

Kann mir bitte jemand sagen, was an diesem SQL-Statement nicht stimmt.

Die Daten werden nicht geholt…
SELECT * FROM SAPRole GROUP BY system WHERE site=‚LI‘

Muss ich bei der GROUP BY Clausel was beachten??

Bitte um Hilfe.

Gruss,
Sebastian

Hallo,

meine SQL-Kenntnisse sind nur rudimentär, aber meiner Ansicht nach müsste es so heißen:

SELECT * FROM SAPRole WHERE site=‚LI‘ GROUP BY system

Also erst den Filter setzen, dann gruppieren bzw. sortieren.

Gruß,

Myriam

hi sebastian

Die Daten werden nicht geholt…
SELECT * FROM SAPRole GROUP BY system WHERE site=‚LI‘

Muss ich bei der GROUP BY Clausel was beachten??

gruppieren ist zwar recht nett, nur musst du der db sagen, was mit den nicht gruppierten spalten passieren soll. bin mir auch nicht sicher, ob du genau weisst, wass das group by tut. ich vermute ja eher, du willst einfach nach der spalte „system“ sortieren - das geht mit dem order by.

gruppiert wird eigentlich nur, wenn man auch gruppenfunktionen verwendet. z.b. ein

select system, count(*) from saprole where site = ‚LI‘ group by system ;

hier wird inter zuerst nach system sortiert, dann pro unterschiedlichen eintrag in system eine gruppe gebildet, dann die gruppenfunktion „count“ pro gruppe angewendet - du zählst also die datensätze pro eintrag in „system“ und gibts das aus.

grundsätzlich ist es so, dass du jede spalte, auf die du keine gruppenfunktion anwendest, in der group-by-klausel haben musst, da die db sich sonst nicht auskennt, was sie tut soll.

lg
erwin

Moin, Sebastian,

Die Daten werden nicht geholt…

das kann nicht alles sein. Der Ausdruck

SELECT * FROM SAPRole GROUP BY system WHERE site=‚LI‘

muss einen Syntaxfehler erzeugen. Was für ein SQL fährst Du? Und wie schaffst Du es, die Fehlermeldung zu verstecken?

Gruß Ralf

Halo Myriam.

meine SQL-Kenntnisse sind nur rudimentär, aber meiner Ansicht
nach müsste es so heißen:

SELECT * FROM SAPRole WHERE site=‚LI‘ GROUP BY system

Also erst den Filter setzen, dann gruppieren bzw. sortieren.

So hats leider auch nicht funktioniert.

Gruss,
Sebastian

So hats leider auch nicht funktioniert.

das ist wiederum keine aussagekräftige fehlermeldung. was ist denn stattdessen
passiert? wo gibst du das statement ein? welches DBS benutzt du? mysql, postgres,
oracle, sqlite, …?

stell dir mal vor, du bist automechaniker, ein kunde kommt zu dir und sagt
„mein auto geht nicht“. statt dem kunden alles aus der nase ziehen
zu müssen, würdest du dich sicher freuen, wenn er dir sagen würde,
was er für ein auto hat, ob es zumindest noch anspringt etc. etc.

So hats leider auch nicht funktioniert.

Wie schon erwähnt ist „es geht nicht“ keine Fehlerbeschreibung :wink:

Versuche es mal ohne den Filter, und dann ohne das „GROUP BY“. So kannst Du das Problem eingrenzen. Wie schon an anderer Stelle erwähnt könnte anstatt GROUP BY auch ORDER BY sinnvoll sein.

Einige Editoren sind meiner Kenntnis nach auch case-sensitive, d.h. Du musst auf Groß-/Kleinschreibung achten.

Gruß,

Myriam

Hallo Erwin.

Vorab vielen Dank für deine ausführliche Antwort.

gruppieren ist zwar recht nett, nur musst du der db sagen, was
mit den nicht gruppierten spalten passieren soll. bin mir auch
nicht sicher, ob du genau weisst, wass das group by tut. ich
vermute ja eher, du willst einfach nach der spalte „system“
sortieren - das geht mit dem order by.

Nene…das order by kenn ich, dass möchte ich nicht.

Bin schon richtig mit dem group by, jedoch wusste ich die syntax nicht…

gruppiert wird eigentlich nur, wenn man auch gruppenfunktionen
verwendet. z.b. ein

select system, count(*) from saprole where site = ‚LI‘ group
by system ;

hier wird inter zuerst nach system sortiert, dann pro
unterschiedlichen eintrag in system eine gruppe gebildet, dann
die gruppenfunktion „count“ pro gruppe angewendet - du zählst
also die datensätze pro eintrag in „system“ und gibts das aus.

k…verstanden. Also durch deine Anleitung hab ichs hinbekommen.

grundsätzlich ist es so, dass du jede spalte, auf die du keine
gruppenfunktion anwendest, in der group-by-klausel haben
musst, da die db sich sonst nicht auskennt, was sie tut soll.

SELECT system, site FROM SAPRole WHERE site='#P1#' GROUP BY system, site

ich hab jetzt die spalten system, site aus der tabelle SAPRole geholt und dann über den Filter WHERE eingegrenzt und mit dem GROUP BY, gruppiert.
Mit diesem statement hats geklappt.

Danke dir vielmals.

Gruss,
Sebastian

Morgen.

das kann nicht alles sein. Der Ausdruck

SELECT * FROM SAPRole GROUP BY system WHERE site=‚LI‘

muss einen Syntaxfehler erzeugen. Was für ein SQL fährst Du?
Und wie schaffst Du es, die Fehlermeldung zu verstecken?

Die Fehlermeldung lautet:
Incorrect syntax near Where…

Ich verwende MS SQL 2005 Server.

Hier die Lösung:

SELECT system, site FROM HILTI.dbo.SAPRole WHERE site='#P1#' GROUP BY system, site

Der Fehler war, dass ich alle Felder, die im Select ausgewählt werden auch in der Group By klausel stehen müssen und natürlich auch ganz am schluss, nachdem ich die WHERE-Abfrage starte. :smile:

Danke euch.

Gruss,
Sebastian

So hats leider auch nicht funktioniert.

Wie schon erwähnt ist „es geht nicht“ keine Fehlerbeschreibung
:wink:

k…sorry, nächstes Mal werde ich die Fehlermeldung lösen, Erwin hat mir die Lösung gezeigt.

Die Fehlermeldung war:
Die Fehlermeldung lautet:
Incorrect syntax near Where…

Die Lösung ist:

SELECT system, site FROM HILTI.dbo.SAPRole WHERE site='#P1#' GROUP BY system, site

Danke euch.
Gruss,
Sebastian

So hats leider auch nicht funktioniert.

das ist wiederum keine aussagekräftige fehlermeldung. was ist
denn stattdessen
passiert? wo gibst du das statement ein? welches DBS benutzt
du? mysql, postgres,
oracle, sqlite, …?

k…stimmt, fehlermeldung posten, sorry.

Wusste ja, es muss an der Syntax liegen. Das problem ist auch, dass ich nicht direkt auf die DB Zugreife sondern, wir haben da ein Tool, das heisst ServiceCatalog (dieser verwendet: xml, SQL, coldFusion, Java und JavaScript). Ich erstelle das Statement in einer XML-Datei und dann wird es ausgeführt, Fehlermeldung sehe ich nicht immer… ziemlich beschissen.

Ich verwende folgende DB: MS SQL Server 2005…
Statement: Wird in der XML-Datei eingegeben.

stell dir mal vor, du bist automechaniker, ein kunde kommt zu
dir und sagt
„mein auto geht nicht“. statt dem kunden alles aus der nase
ziehen
zu müssen, würdest du dich sicher freuen, wenn er dir sagen
würde,
was er für ein auto hat, ob es zumindest noch anspringt etc.
etc.

Ja ist klar, werde die Fehlermeldung beim nächsten Mal posten.

Danke euch für die vielen Antworten.

Gruss,
Sebastian

Hallo Sebastian,

werde aus den Antworten nicht schlau, ob du jetzt schon die richtige Lösung hast.

Bei einer Group-Anweisung ist das Stern-Symbol für die Feldauswahl nicht erlaubt. Außerdem hast du die Group- und Where-Abschnitte vertauscht.

Du kannst im Group-Abschnitt auch Felder angeben, die nicht in der Feldauswahl enthalten sind, nach denen aber trotzdem deine Daten zusammengefasst werden sollen. Enthält deine Feldauswahl Felder, die du in der Anzeige benötigst, ohne dass eine Summe usw. berechnet werden muss, wiederholen sich diese Felder auf alle Fälle im Group-Abschnitt.

Wenn in deiner Feldauswahl Felder vorhanden sind, die z. B. summiert oder gezählt werden, wird nach diesen nicht gruppiert.

Deine SQL-Anweisung müsste in etwa so lauten:

SELECT Feld1, Feld2 FROM SAPRole
WHERE site=‚LI‘
GROUP BY system, Feld1, Feld2

Wenn du eine Anzahl oder ähnliches benötigst, könnte es auch so aussehen:

SELECT Feld1, Feld2, Sum(Umsatz) as Gesamtumsatz FROM SAPRole
WHERE site=‚LI‘
GROUP BY system, Feld1, Feld2

Viele Grüße
EPa

hallo sebastian

SELECT system, site FROM SAPRole WHERE site=’#P1#’ GROUP
BY system, site

hmm - dieses statement tut also dass, was du willst? also einfach nur alle vorkommenden kombinationen von system und site, unabhängig davon, wie oft die vorkommen? das geht auch einfacher (v.a. für die datenbank):

select distinct system, site from saprole where site = '#P1#' ;

das group by tut natürlich genau das selbe, ist für die datenbank aber um einiges aufwändiger durchzuführen. gut, wenn die datenmenge klein ist und der rechner sich sowieso fadisiert ist es völlig irrelevant, wie du dein ergebnis bekommst. wenn die lösung aber skalieren soll - spricht, auch bei hoher benutzerlast am server und von vielen benutzern gleichzeitig ausgeführt - ist das distinct eher zu empfehlen. abgesehen davon, dass es meiner meinung nach leichter zu verstehen ist - beim distinct weiss jeder db-profi sofort, was du willst, beim group by muss jeder mal nachdenken, was genau du beabsichtigt hast…

lg
erwin