Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Abfrage mit Group By

20 views
Skip to first unread message

Lothar Geyer

unread,
Sep 2, 2012, 3:21:41 AM9/2/12
to
In einer VB6-Anwendung, die mit Access und SQLserver arbeitet, habe ich
folgende Abfrage:

sql = "Select up.Beurteilung, Sum(up.Dauer) AS Sekunden" _
& ", Count(up.Dauer) AS Anzahl" _
& " From UmPa up" _
& " Group by Beurteilung" _
& " Order by Beurteilung"

Soweit OK.
Jede "Beurteilung" ist in einer anderen Tabelle definiert mit diversen
Parametern, einer davon ist "positiv" (Boolean). Nun soll die obige
Abfrage eine neue Sortierung erhalten:

Order By positiv, Beurteilung

Ich habe das so probiert:

sql = "Select up.Beurteilung, Sum(up.Dauer) AS Sekunden" _
& ", Count(up.Dauer) AS Anzahl" _
& ", uc.positiv" _
& " From UmPa up" _
& " Left Join UCC uc On up.Beurteilung=uc.Name" _
& " Group by Beurteilung" _
& " Order by positiv, Beurteilung"

Das klappt aber nicht. Was ich auch immer probiere, ich bekomme
Fehlermeldungen. Was mache ich falsch?

Lothar Geyer

Siegfried Schmidt

unread,
Sep 2, 2012, 4:03:51 AM9/2/12
to
Lothar Geyer schrieb:

> Das klappt aber nicht. Was ich auch immer probiere, ich bekomme
> Fehlermeldungen. Was mache ich falsch?

1. Du verrᅵts nicht wie die Fehlermeldung lautet
2. Du musst alle Spalten nach denen sortiert werden soll auch in die
Gruppierung aufnehmen
3. Namen eignen sich nur bedingt zur Verknᅵpfung von Tabellen


Siegfried

lothar...@googlemail.com

unread,
Sep 2, 2012, 6:28:32 AM9/2/12
to
Ich habe jetzt zwei Mal mit Thunderbird geantwortet - und das Posting ist nicht sichtbar. Jetzt versuch ichs mal über Google Groups.

Am Sonntag, 2. September 2012 10:03:51 UTC+2 schrieb Siegfried Schmidt:
> > Das klappt aber nicht. Was ich auch immer probiere, ich bekomme
>
> > Fehlermeldungen. Was mache ich falsch?
>
>
>
> 1. Du verrᅵts nicht wie die Fehlermeldung lautet

Zunächst mal wenn ich das Feld "positiv" in die Liste der zu selektierenden Felder aufnehme, kommt eine Meldung ala "Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck 'positiv' nicht als Teil der Aggregatfunktion einschließt." bei SQLserver, Access ähnlich.
Dann mit "Group By Beurteilung, positiv" kommt beim SQLserver gar nichts (leerer Recordset, keine Fehlermeldung), bei Access kommt die Fehlermeldung "Kein aktueller Datensatz."

> 2. Du musst alle Spalten nach denen sortiert werden soll auch in die
>
> Gruppierung aufnehmen

Hatte ich wohl getan. Im ersten Posting hatte ich nur mit dem ursprünglichen Statement begonnen (das ja läuft), um das Problem besser erläutern zu können und ab wann es auftrat.

Lothar Geyer

Bastian Blank

unread,
Sep 2, 2012, 8:08:24 AM9/2/12
to
Lothar Geyer wrote:
> In einer VB6-Anwendung, die mit Access und SQLserver arbeitet, habe ich
> folgende Abfrage:
> sql = "Select up.Beurteilung, Sum(up.Dauer) AS Sekunden" _
> & ", Count(up.Dauer) AS Anzahl" _
> & " From UmPa up" _
> & " Group by Beurteilung" _
> & " Order by Beurteilung"

Das ist kein SQL, was hier on-topic ist. Das sieht eher nach VB aus, was
hier nicht hergehört.

> Das klappt aber nicht. Was ich auch immer probiere, ich bekomme
> Fehlermeldungen. Was mache ich falsch?

Du verrätst die Fehlermeldung nicht.

Bastian

Lothar

unread,
Sep 2, 2012, 8:25:09 AM9/2/12
to
On 2 Sep., 14:08, Bastian Blank <use...@waldi.eu.org> wrote:
> Lothar Geyer wrote:
> > In einer VB6-Anwendung, die mit Access und SQLserver arbeitet, habe ich
> > folgende Abfrage:
> >    sql = "Select up.Beurteilung, Sum(up.Dauer) AS Sekunden" _
> >        & ", Count(up.Dauer) AS Anzahl" _
> >        & " From UmPa up" _
> >        & " Group by Beurteilung" _
> >        & " Order by Beurteilung"
>
> Das ist kein SQL, was hier on-topic ist. Das sieht eher nach VB aus, was
> hier nicht hergehört.

Dass dieses SQL-Statement in einer VB-Anwendung verwendet wird (was
ich im ersten Posting auch geschrieben habe - Du solltest aufmerksamer
lesen), ändert nichts daran, dass es in SQL geschrieben ist und
genauso direkt in Access order SQLserver ausgeführt werden kann.

> Du verrätst die Fehlermeldung nicht.

Wenn Du schon die Postings nicht genau liest, solltest Du Dich
wenigstens über die Anzahl informieren.

Lothar Geyer

Siegfried Schmidt

unread,
Sep 2, 2012, 12:09:37 PM9/2/12
to
lothar...@googlemail.com schrieb:

> Ich habe jetzt zwei Mal mit Thunderbird geantwortet - und das Posting
> ist nicht sichtbar.

Wenn du Antworten als eMail verschickst liegen sie in deinem Mailausgang,
aber niemals in einer Newsgroup.

> Zunᅵchst mal wenn ich das Feld "positiv" in die Liste der zu
> selektierenden Felder aufnehme, kommt eine Meldung ala "Sie wollten
> eine Abfrage ausfᅵhren, die den angegebenen Ausdruck 'positiv' nicht
> als Teil der Aggregatfunktion einschlieᅵt."

Da steht ja schon der richtige Hinweis.

> ᅵhnlich. Dann mit "Group By Beurteilung, positiv" kommt beim SQLserver
> gar nichts (leerer Recordset, keine Fehlermeldung), bei Access kommt
> die Fehlermeldung "Kein aktueller Datensatz."

Damit ist die Abfrage syntaktisch richtig. Wenn nichts kommt stimmt etwas
an deinen Inhalten nicht - wahrscheinlich liefert der join keine
ᅵbereinstimmung in den beteiligten Spalten.


Siegfried



Jörg Burzeja

unread,
Sep 2, 2012, 3:15:46 PM9/2/12
to
Am 02.09.2012 14:25, schrieb Lothar:

>>> In einer VB6-Anwendung, die mit Access und SQLserver arbeitet, habe ich
>>> folgende Abfrage:
>>> sql = "Select up.Beurteilung, Sum(up.Dauer) AS Sekunden" _
>>> & ", Count(up.Dauer) AS Anzahl" _
>>> & " From UmPa up" _
>>> & " Group by Beurteilung" _
>>> & " Order by Beurteilung"
>>
>> Das ist kein SQL, was hier on-topic ist. Das sieht eher nach VB aus, was
>> hier nicht hergeh�rt.
>
> Dass dieses SQL-Statement in einer VB-Anwendung verwendet wird (was
> ich im ersten Posting auch geschrieben habe - Du solltest aufmerksamer
> lesen), �ndert nichts daran, dass es in SQL geschrieben ist und
> genauso direkt in Access order SQLserver ausgef�hrt werden kann.


Warum machst Du nicht zwei Schritte daraus?

SQL Abfrage per SSMS direkt an den SQL Server abschicken.

So kannst Du schon mal sehen, ob die �bernahme in VB6 oder bereits die
Abfrage den Fehler verursacht.

Ist die Abfrage das Problem, geh�rt es in diese Gruppe.

Ist die �bernahme nach VB6 das Problem, geh�rt es in eine VB Gruppe.



--
Viele Gr�sse
J�rg

Ingo Moch

unread,
Sep 2, 2012, 6:05:34 PM9/2/12
to
Hallo Lothar,

Lothar Geyer wrote:

> sql = "Select up.Beurteilung, Sum(up.Dauer) AS
> Sekunden" _ & ", Count(up.Dauer) AS Anzahl" _
> & ", uc.positiv" _
> & " From UmPa up" _
> & " Left Join UCC uc On up.Beurteilung=uc.Name" _
> & " Group by Beurteilung" _
> & " Order by positiv, Beurteilung"
>
> Das klappt aber nicht. Was ich auch immer probiere, ich
> bekomme Fehlermeldungen. Was mache ich falsch?

Das kann auch nicht klappen. Jedes Feld im
SELECT-Abschnitt muss entweder auch im GROUP BY-Abschnitt
vorkommen oder mit SUM(), COUNT(), MIN() ... behandelt
werden.

Ingo

Ingo Moch

unread,
Sep 2, 2012, 6:01:48 PM9/2/12
to
J�rg Burzeja wrote:
> Lothar schrieb:
>> Bastian Blank wrote:
>>> Lothar Geyer wrote:

>>>> In einer VB6-Anwendung, die mit Access und SQLserver
>>>> arbeitet, habe ich folgende Abfrage:
>>>> sql = "Select up.Beurteilung, Sum(up.Dauer) AS
>>>> Sekunden" _ & ", Count(up.Dauer) AS Anzahl" _
>>>> & " From UmPa up" _
>>>> & " Group by Beurteilung" _
>>>> & " Order by Beurteilung"

>>> Das ist kein SQL, was hier on-topic ist. Das sieht eher
>>> nach VB aus, was hier nicht hergeh�rt.

> So kannst Du schon mal sehen, ob die �bernahme in VB6
> oder bereits die Abfrage den Fehler verursacht.
>
> Ist die Abfrage das Problem, geh�rt es in diese
> Gruppe.
>
> Ist die �bernahme nach VB6 das Problem, geh�rt es
> in eine VB Gruppe.

Wo ist das Problem. Der OP betreibt eine
Zeichenfolgenverkettung, damit er in seinem Editor
die das komplette Statement im Scrollarien sehen
kann. Da ist nicht so wirklich Potenzial fuer ein
VB-seitiges Problem.

Ingo

Lothar Geyer

unread,
Sep 3, 2012, 1:26:39 AM9/3/12
to
Guten Morgen,

Am 02.09.2012 18:09, schrieb Siegfried Schmidt:
> lothar...@googlemail.com schrieb:
>
>> Ich habe jetzt zwei Mal mit Thunderbird geantwortet - und das Posting
>> ist nicht sichtbar.
>
> Wenn du Antworten als eMail verschickst liegen sie in deinem Mailausgang,
> aber niemals in einer Newsgroup.

es scheint ich habe meinen Fehler gefunden: offenbar habe ich auf
"Antworten" geklickt und nicht auf "Newsgroup" antworten. Hab eich
gerade gemerkt - und wahrscheinlich hast Du schon wieder eine Mail von
mir. Sorry. Ich werde aufpassen.

>> Zunᅵchst mal wenn ich das Feld "positiv" in die Liste der zu
>> selektierenden Felder aufnehme, kommt eine Meldung ala "Sie wollten
>> eine Abfrage ausfᅵhren, die den angegebenen Ausdruck 'positiv' nicht
>> als Teil der Aggregatfunktion einschlieᅵt."
>
> Da steht ja schon der richtige Hinweis.

Das war ja auch nicht mein Problem.

>> ᅵhnlich. Dann mit "Group By Beurteilung, positiv" kommt beim SQLserver
>> gar nichts (leerer Recordset, keine Fehlermeldung), bei Access kommt
>> die Fehlermeldung "Kein aktueller Datensatz."
>
> Damit ist die Abfrage syntaktisch richtig. Wenn nichts kommt stimmt etwas
> an deinen Inhalten nicht - wahrscheinlich liefert der join keine
> ᅵbereinstimmung in den beteiligten Spalten.

Fᅵr jede Beurteilung in der Tabelle UmPa muss ein Satz in Tabelle UCC
existieren. Das stellt ein Foreign Key sicher. Und wenn ich das Group By
entferne, erhalte ich ja auch Ergebnisse.

Lothar Geyer

Lothar Geyer

unread,
Sep 3, 2012, 1:29:45 AM9/3/12
to
Hallo J�rg,

Am 02.09.2012 21:15, schrieb J�rg Burzeja:
> Am 02.09.2012 14:25, schrieb Lothar:
> ...
>> Dass dieses SQL-Statement in einer VB-Anwendung verwendet wird (was
>> ich im ersten Posting auch geschrieben habe - Du solltest aufmerksamer
>> lesen), �ndert nichts daran, dass es in SQL geschrieben ist und
>> genauso direkt in Access order SQLserver ausgef�hrt werden kann.
>
>
> Warum machst Du nicht zwei Schritte daraus?
>
> SQL Abfrage per SSMS direkt an den SQL Server abschicken.
>
> So kannst Du schon mal sehen, ob die �bernahme in VB6 oder bereits die
> Abfrage den Fehler verursacht.

Habe ich gemacht.

> Ist die Abfrage das Problem, geh�rt es in diese Gruppe.
>
> Ist die �bernahme nach VB6 das Problem, geh�rt es in eine VB Gruppe.

Und was glaubst Du, warum ich das Problem hier und nicht in der
VB-Gruppe gepostet habe?

Lothar Geyer

Lothar Geyer

unread,
Sep 3, 2012, 11:53:09 AM9/3/12
to
Hallo Ingo,

Am 03.09.2012 00:05, schrieb Ingo Moch:
> ...
mit anderen Worten: es geht nicht. Falls ich eine der Funktionen Sum,
Min, Max oder so verwende, meint der SQLserver, es geht nicht. Und der
Count liefert keine Aussage.

Nun doch eine OT-Frage:
Ich habe versucht, den Recordset zu disconnecten, um ein Feld
anzuhᅵngen, in das ich "positiv" eintragen kann. Dann kᅵnnte ich
zumindest danach sortieren und alles in einer Schleife ausgeben. Das
geht aber auch nicht.
Jetzt habe ich zwei (fast) identische Schleifen, in denen ich einmal die
positiven Werte und einmal die negativen Werte ausgebe und Gesamtsummen
ermittle.

Hᅵttest Du da noch einen Verbesserungsvorschlag?

Lothar Geyer

Jörg Burzeja

unread,
Sep 3, 2012, 2:51:04 PM9/3/12
to
Hallo Lothar,

> Am 02.09.2012 21:15, schrieb J�rg Burzeja:
>> Am 02.09.2012 14:25, schrieb Lothar:
>> ...
>>> Dass dieses SQL-Statement in einer VB-Anwendung verwendet wird (was
>>> ich im ersten Posting auch geschrieben habe - Du solltest aufmerksamer
>>> lesen), �ndert nichts daran, dass es in SQL geschrieben ist und
>>> genauso direkt in Access order SQLserver ausgef�hrt werden kann.
>>
>>
>> Warum machst Du nicht zwei Schritte daraus?
>>
>> SQL Abfrage per SSMS direkt an den SQL Server abschicken.
>>
>> So kannst Du schon mal sehen, ob die �bernahme in VB6 oder bereits die
>> Abfrage den Fehler verursacht.
>
> Habe ich gemacht.

Und warum stellst Du dann nicht die SQL-Abfrage ein?

SELECT up.Beurteilung,
Sum (up.Dauer) AS Sekunden,
COUNT (up.Dauer) AS Anzahl,
uc.positiv

From UmPa up
Left Join UCC uc ON (up.Beurteilung = uc.Name)

GROUP BY up.Beurteilung,
uc.positiv
~~~~~~~~~~

Beachte was ich Dir unterstrichen habe, und auf das in den anderen
Beitr�gen schon hingewiesen wurde.

>> Ist die Abfrage das Problem, geh�rt es in diese Gruppe.
>>
>> Ist die �bernahme nach VB6 das Problem, geh�rt es in eine VB Gruppe.
>
> Und was glaubst Du, warum ich das Problem hier und nicht in der
> VB-Gruppe gepostet habe?

Und was glaubst Du, was jemand, der eine deutschsprachige Gruppe
abonniert lesen m�chte? Spanisch?

Wolfgang May

unread,
Sep 10, 2012, 2:28:41 PM9/10/12
to
Lothar Geyer <Lothar...@edv-berater-online.de> wrote:
> Hallo Ingo,
>
> Am 03.09.2012 00:05, schrieb Ingo Moch:
>> ...
>>> sql = "Select up.Beurteilung, Sum(up.Dauer) AS
>>> Sekunden" _ & ", Count(up.Dauer) AS Anzahl" _
>>> & ", uc.positiv" _
>>> & " From UmPa up" _
>>> & " Left Join UCC uc On up.Beurteilung=uc.Name" _
>>> & " Group by Beurteilung" _
>>> & " Order by positiv, Beurteilung"
>>>
>>> Das klappt aber nicht. Was ich auch immer probiere, ich
>>> bekomme Fehlermeldungen. Was mache ich falsch?
>>
>> Das kann auch nicht klappen. Jedes Feld im
>> SELECT-Abschnitt muss entweder auch im GROUP BY-Abschnitt
>> vorkommen oder mit SUM(), COUNT(), MIN() ... behandelt
>> werden.
>
> mit anderen Worten: es geht nicht. Falls ich eine der Funktionen Sum,
> Min, Max oder so verwende, meint der SQLserver, es geht nicht. Und der
> Count liefert keine Aussage.

Doch, geht (wenn Du Deinen Wunsch richtig beschreibst) so:
select ...
from ... left join ...
group by Beurteilung, positiv
order by positiv, Beurteilung

Aber: Ist "positiv" ueberhaupt ein Spaltenname (in UCC)?
Wenn ja siehe oben.
Wenn nein:

select ...
from ... left join ...
where uc.HIER_DEN_SPALTENNAMEN_EINSETZEN = 'positiv'
group by beurteilung
order by beurteilung

Wolfgang

Lothar Geyer

unread,
Sep 11, 2012, 1:52:41 AM9/11/12
to
Hallo Wolfgang,

Am 10.09.2012 20:28, schrieb Wolfgang May:
> ...
> Doch, geht (wenn Du Deinen Wunsch richtig beschreibst) so:
> select ...
> from ... left join ...
> group by Beurteilung, positiv
> order by positiv, Beurteilung

witzig: Du hast Recht. Ich mᅵchte nur wissen, was ich da beim letzten
Mal getestet habe. Die Select-Anweisung lautet nun

Select up.Beurteilung, SUM(up.Dauer) AS Sekunden, COUNT(up.Dauer) AS
Anzahl, uc.positiv

> Aber: Ist "positiv" ueberhaupt ein Spaltenname (in UCC)?

Ist eine Spalte in UCC, vom Typ "bit" bzw. in Access "Ja/Nein". Fᅵr alle
Sᅵtze in UmPa, in denen "Beurteilung" nicht gesetzt ist, wird ein
korrekter Summen-Satz geliefert mit <NULL> in der Spalte "positiv".

Aber leider lᅵuft es nur mit dem SQLserver. Mit Access kommt die Meldung
"Kein aktueller Datensatz".

Aber dann habe ich in Access (2k) Folgendes probiert:

Select up.Beurteilung, SUM(up.Dauer) AS Sekunden,
COUNT(up.Dauer) AS Anzahl, SUM(uc.positiv)
^^^^
from ... left join ...
where Beurteilung Is Not Null
group by ...
order by ...

und das funktioniert auch und bringt fᅵr die negativen Beurteilungen in
der Spalte "positiv" den negativen Wert der Spalte "Anzahl", was ja
logisch erscheint und leicht zu handhaben ist. Ich bekomme aber keine
Summen fᅵr die Datensᅵtze, in denen die Beurteilung = Null ist.

Lothar Geyer

Jörg Burzeja

unread,
Sep 11, 2012, 4:12:05 PM9/11/12
to
Am 11.09.2012 07:52, schrieb Lothar Geyer:

> Aber dann habe ich in Access (2k) Folgendes probiert:
>
> Select up.Beurteilung, SUM(up.Dauer) AS Sekunden,
> COUNT(up.Dauer) AS Anzahl, SUM(uc.positiv)
> ^^^^
> from ... left join ...
> where Beurteilung Is Not Null
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

[...]

>Ich bekomme aber keine
> Summen fᅵr die Datensᅵtze, in denen die Beurteilung = Null ist.

Hast Du doch explizit in der WHERE Bedingung weggefiltert.


--
Viele Grᅵsse
Jᅵrg

Lothar Geyer

unread,
Sep 12, 2012, 1:30:00 AM9/12/12
to
Hallo Jᅵrg,

Am 11.09.2012 22:12, schrieb Jᅵrg Burzeja:
> ...
>> Ich bekomme aber keine
>> Summen fᅵr die Datensᅵtze, in denen die Beurteilung = Null ist.
>
> Hast Du doch explizit in der WHERE Bedingung weggefiltert.

musste ich ja, sonst kommt die Fehlermeldung "Kein aktueller Datensatz".

Lothar Geyer

Wolfgang May

unread,
Sep 12, 2012, 6:32:15 AM9/12/12
to
Lothar Geyer <Lothar...@edv-berater-online.de> wrote:

> Aber leider lᅵuft es nur mit dem SQLserver. Mit Access kommt die Meldung
> "Kein aktueller Datensatz".

Access ist keine Datenbank, sondern eine Krankheit ...

> Aber dann habe ich in Access (2k) Folgendes probiert:
>
> Select up.Beurteilung, SUM(up.Dauer) AS Sekunden,
> COUNT(up.Dauer) AS Anzahl, SUM(uc.positiv)
> ^^^^
> from ... left join ...
> where Beurteilung Is Not Null
> group by ...
> order by ...
>
> und das funktioniert auch und bringt fᅵr die negativen Beurteilungen in
> der Spalte "positiv" den negativen Wert der Spalte "Anzahl", was ja
> logisch erscheint und leicht zu handhaben ist. Ich bekomme aber keine
> Summen fᅵr die Datensᅵtze, in denen die Beurteilung = Null ist.


dann probier mal anstatt
... left join up
wobei up Spalten (a,b,c,Beurteilung,d,e,f) hat

... left join
(select (a,b,c,nvl(Beurteilung,999),d,e,f) from up)

Damit wird nicht mit up gejoint, sondern mit einem veraenderten view
darauf, das null durch 999 (bzw einen Wert, den Du da setzen kannst wie Du
willst).
Nicht so optimal ist, dass das wenn ich Dich richtig verstanden
habe eine Bit-Spalte ist, wo Du fuer 999 keine gute Auswahl frei hast.

=> versuchs aehnlich wie oben mit einem View ueber up, das die eine SPalte
ggf komplett neu definiert (ggf mit union oder case).

Wolfgang

Jörg Burzeja

unread,
Sep 12, 2012, 1:27:36 PM9/12/12
to
Ich verstehe nicht was Du mᅵchtest / nicht funktioniert.

Stelle mal ein paar Musterdaten der beiden Tabellen zur Verfᅵgung,
danach wie das Ergebnis aussehen soll.
0 new messages