Discussion:
Jeweils ersten Datensatz einer Gruppe anzeigen
(zu alt für eine Antwort)
Patrick Pohlmann
2004-11-22 11:29:20 UTC
Permalink
Hallo zusammen,

ich habe eine Sicht die so aussieht:

Vertrag; Tarif; Kosten
1; 1; 10 Euro
1; 2; 12 Euro
1; 3; 15 Euro
2; 2; 9 Euro
2; 1; 10 Euro
2; 3; 19 Euro
3; 3; 21 Euro
3; 2; 25 Euro
3; 1; 31 Euro
4; 2; 34 Euro
4; 1; 48 Euro
4; 3; 49 Euro

usw.

Die Tabelle zeigt also an, wieviel ein Vertrag in einem bestimmten Tarif
kostet.

Nun möchte ich diese Tabelle nun so gruppieren, dass mir für jeden Vertrag
jeweils nur der günstigeste Tarif mit Kosten angezeigt wird. In Access ging
das indem man die Tabelle entsprechend sortiert hat und dann mit FIRST
jeweils den esretn Wert angezeigt hat. Das gibt es aber wohl auf dem SQL
Server nicht. Was kann ich tun?

Das Ergebnis müsste wie folgt aussehen:

1; 1; 10 Euro
2; 2; 9 Euro
3; 3; 21 Euro
3; 2; 34 Euro

Vielen Dank für Eure Tipps.

Viele Grüße

Patrick!
Christa Kurschat
2004-11-22 11:48:09 UTC
Permalink
Hallo Patrick,
Post by Patrick Pohlmann
Hallo zusammen,
Vertrag; Tarif; Kosten
1; 1; 10 Euro
1; 2; 12 Euro
1; 3; 15 Euro
2; 2; 9 Euro
2; 1; 10 Euro
2; 3; 19 Euro
3; 3; 21 Euro
3; 2; 25 Euro
3; 1; 31 Euro
4; 2; 34 Euro
4; 1; 48 Euro
4; 3; 49 Euro
usw.
Die Tabelle zeigt also an, wieviel ein Vertrag in einem
bestimmten Tarif kostet.
Nun möchte ich diese Tabelle nun so gruppieren, dass mir für
jeden Vertrag jeweils nur der günstigeste Tarif mit Kosten
angezeigt wird. In Access ging das indem man die Tabelle
entsprechend sortiert hat und dann mit FIRST jeweils den
esretn Wert angezeigt hat. Das gibt es aber wohl auf dem SQL
Server nicht. Was kann ich tun?
Bei "First" in Acc war es aber auch eher Zufall, wenn das rauskam, was Du
wolltest ;-)
Post by Patrick Pohlmann
1; 1; 10 Euro
2; 2; 9 Euro
3; 3; 21 Euro
3; 2; 34 Euro
Du mußt zuerst den Satz mit den jeweils geringsten Kosten identifizieren.
select Vertrag, Tarif, Kosten from v_DeineView a inner join
(select Vertrag, min(Kosten) as MinKosten from v_DeineView group by Vetrag)
b on
a.vertrag = b.Vertrag and
a.Kosten = b.Kosten

Gruß
Christa
--
Access-FAQ: http://www.donkarl.com
SQL-Server-FAQ: http://www.berndjungbluth.de/sqlfaq/sqlfaq.htm
auch interessant: http://www.insidesql.de
Suchen in den Newsgroups:
http://groups.google.de/advanced_group_search?hl=de&lr=&ie=UTF-8
Patrick Pohlmann
2004-11-22 13:24:29 UTC
Permalink
Hallo Christa,

ich muss also zwei Views erstellen und diese dann in einer Dritten
miteinader in Beziehung bringen? Oder verstehe ich da was falsch?

Grüße

Patrick!
Post by Christa Kurschat
Hallo Patrick,
Du mußt zuerst den Satz mit den jeweils geringsten Kosten identifizieren.
select Vertrag, Tarif, Kosten from v_DeineView a inner join
(select Vertrag, min(Kosten) as MinKosten from v_DeineView group by Vetrag)
b on
a.vertrag = b.Vertrag and
a.Kosten = b.Kosten
Gruß
Christa
Christa Kurschat
2004-11-22 13:47:32 UTC
Permalink
Hallo Patrick,
Post by Patrick Pohlmann
Hallo Christa,
ich muss also zwei Views erstellen und diese dann in einer
Dritten miteinader in Beziehung bringen? Oder verstehe ich da
was falsch?
kannst Du machen, muß aber nicht, geht auch alles in einem view.

Gruß
Christa
--
Access-FAQ: http://www.donkarl.com
SQL-Server-FAQ: http://www.berndjungbluth.de/sqlfaq/sqlfaq.htm
auch interessant: http://www.insidesql.de
Suchen in den Newsgroups:
http://groups.google.de/advanced_group_search?hl=de&lr=&ie=UTF-8
Patrick Pohlmann
2004-11-22 16:14:13 UTC
Permalink
Okay, dan verstehe ich das mit a und b nicht. Mein Statement sieht nun so
aus:

(Meine Abfrage heist tmpSicht_SummeJeTarif)

SELECT VertragNr, RahmentarifID, SummeNettoRabatt
FROM dbo.v_tmpSicht_SummeJeTarif a INNER JOIN
(SELECT VertragNr, MIN(SummeNettoRabatt) AS
MinKosten
FROM v_tmpSicht_SummeJeTarif
GROUP BY VetragNr) b ON a.VertragNr =
b.VertragNr AND a.SummeNettoRabatt = b.SummeNettoRabatt


Das geht noch nicht auf, bzw. mir fehlt Wissen, dass Du ggf. voraussetzt.
Ich a und b sind doch variablen die die jeweilige Abfrage widerspiegeln.
Muss ich das nicht irgendwo zuweisen?

Nochmals Danke für Deine Mühe.

Viele Grüße

Patrick!
Post by Christa Kurschat
Hallo Patrick,
Post by Patrick Pohlmann
Hallo Christa,
ich muss also zwei Views erstellen und diese dann in einer
Dritten miteinader in Beziehung bringen? Oder verstehe ich da
was falsch?
kannst Du machen, muß aber nicht, geht auch alles in einem view.
Gruß
Christa
--
Access-FAQ: http://www.donkarl.com
SQL-Server-FAQ: http://www.berndjungbluth.de/sqlfaq/sqlfaq.htm
auch interessant: http://www.insidesql.de
http://groups.google.de/advanced_group_search?hl=de&lr=&ie=UTF-8
Christa Kurschat
2004-11-23 07:30:40 UTC
Permalink
Hallo Patrick,
Post by Patrick Pohlmann
Okay, dan verstehe ich das mit a und b nicht. Mein Statement
(Meine Abfrage heist tmpSicht_SummeJeTarif)
SELECT VertragNr, RahmentarifID, SummeNettoRabatt
FROM dbo.v_tmpSicht_SummeJeTarif a INNER JOIN
(SELECT VertragNr,
MIN(SummeNettoRabatt) AS MinKosten
FROM
v_tmpSicht_SummeJeTarif GROUP BY
VetragNr) b ON a.VertragNr = b.VertragNr AND
a.SummeNettoRabatt = b.SummeNettoRabatt
sieht doch aber gut aus.
Geht's nicht oder kommt nicht das richtieg raus?
Post by Patrick Pohlmann
Das geht noch nicht auf, bzw. mir fehlt Wissen, dass Du ggf.
voraussetzt. Ich a und b sind doch variablen die die jeweilige
Abfrage widerspiegeln. Muss ich das nicht irgendwo zuweisen?
a und b sind Alias-Namen für die Tabellen bzw. Abfragen. Das in Klammern
nennt man eine abgeleitete Tabelle. Das könnte man natürlich auch in einer
gesonderten Abfrage unterbringen und diese dann mit der anderen verknüpfen.
Eine abgeleitete Tabelle muß immer einen Alias haben. Um es ganz genau zu
machen, müßte der Alias der Tabelle bzw. Abfrage nun noch vor die Feldnamen
gesetzt und der Alias mit "as" zugewiesen werden.
SELECT a.VertragNr, a.RahmentarifID, a.SummeNettoRabatt
FROM dbo.v_tmpSicht_SummeJeTarif as a INNER JOIN
(SELECT VertragNr,
MIN(SummeNettoRabatt) AS MinKosten
FROM
v_tmpSicht_SummeJeTarif GROUP BY
VetragNr) as b ON a.VertragNr = b.VertragNr AND
a.SummeNettoRabatt = b.SummeNettoRabatt

Der join ist hier nur als Filter zu sehen um die Sätze mit den jeweils
niedrigsten Tarifen zu ermitteln.

Ist das einigermaßen verständlich rübergekommen? Wenn nicht, frag einfach
nochmal nach.

Gruß
Christa
--
Access-FAQ: http://www.donkarl.com
SQL-Server-FAQ: http://www.berndjungbluth.de/sqlfaq/sqlfaq.htm
auch interessant: http://www.insidesql.de
Suchen in den Newsgroups:
http://groups.google.de/advanced_group_search?hl=de&lr=&ie=UTF-8
Patrick Pohlmann
2004-11-23 14:44:52 UTC
Permalink
Mist, das geht immer noch nicht.

dbo.v_tmpSicht_SummeJeTarif ist nicht bekannt. Ich gehe mal davon aus, dass
das v_ hier auch falsch ist. Aber selbst wenn ich das entferne klappt es
nicht.

Mein Code sieht nun so aus:

SELECT a.VertragNr, a.RahmentarifID, a.SummeNettoRabatt
FROM dbo.tmpSicht_SummeJeTarif as a INNER JOIN
(SELECT VertragNr,
MIN(SummeNettoRabatt) AS MinKosten
FROM
tmpSicht_SummeJeTarif GROUP BY
VetragNr) as b ON a.VertragNr = b.VertragNr AND
a.SummeNettoRabatt = b.SummeNettoRabatt

Ich bekomme die Meldung "ungültiger Spaltenname" für VertragNr und
SummeNettoRabatt.

Ich habe schon versucht b. vor die Spaltenname der abgeleiteten Tabelle zu
stellen, aber das stimmt dann angeblich mit keinem in der Abfrage
verwendeten Tabellennamen überein. :-(

Noch eine Idee?

Nochmals vielen Dank für die Geduld.

Viele Grüße

Patrick!
Post by Christa Kurschat
a und b sind Alias-Namen für die Tabellen bzw. Abfragen. Das in Klammern
nennt man eine abgeleitete Tabelle. Das könnte man natürlich auch in einer
gesonderten Abfrage unterbringen und diese dann mit der anderen verknüpfen.
Eine abgeleitete Tabelle muß immer einen Alias haben. Um es ganz genau zu
machen, müßte der Alias der Tabelle bzw. Abfrage nun noch vor die Feldnamen
gesetzt und der Alias mit "as" zugewiesen werden.
SELECT a.VertragNr, a.RahmentarifID, a.SummeNettoRabatt
FROM dbo.v_tmpSicht_SummeJeTarif as a INNER JOIN
(SELECT VertragNr,
MIN(SummeNettoRabatt) AS MinKosten
FROM
v_tmpSicht_SummeJeTarif GROUP BY
VetragNr) as b ON a.VertragNr = b.VertragNr AND
a.SummeNettoRabatt = b.SummeNettoRabatt
Der join ist hier nur als Filter zu sehen um die Sätze mit den jeweils
niedrigsten Tarifen zu ermitteln.
Ist das einigermaßen verständlich rübergekommen? Wenn nicht, frag einfach
nochmal nach.
Gruß
Christa
--
Access-FAQ: http://www.donkarl.com
SQL-Server-FAQ: http://www.berndjungbluth.de/sqlfaq/sqlfaq.htm
auch interessant: http://www.insidesql.de
http://groups.google.de/advanced_group_search?hl=de&lr=&ie=UTF-8
Christa Kurschat
2004-11-23 15:34:19 UTC
Permalink
Hallo Patrick,
Post by Patrick Pohlmann
Mist, das geht immer noch nicht.
dbo.v_tmpSicht_SummeJeTarif ist nicht bekannt. Ich gehe mal
davon aus, dass das v_ hier auch falsch ist. Aber selbst wenn
ich das entferne klappt es nicht.
Das v_ muß natürlich nur davor, wenn Deine Sicht so heißt. ;-)
Gehört die Sicht denn dem dbo?
Oder anders gefragt, arbeitest Du als dbo oder als Patrick?
Laß den Benutzer mal weg, ob es dann geht.
Post by Patrick Pohlmann
SELECT a.VertragNr, a.RahmentarifID, a.SummeNettoRabatt
FROM dbo.tmpSicht_SummeJeTarif as a INNER JOIN
(SELECT VertragNr,
MIN(SummeNettoRabatt) AS MinKosten
FROM
tmpSicht_SummeJeTarif GROUP BY
VetragNr) as b ON a.VertragNr = b.VertragNr AND
a.SummeNettoRabatt = b.SummeNettoRabatt
Ich bekomme die Meldung "ungültiger Spaltenname" für VertragNr
und SummeNettoRabatt.
Du solltest schon die Spaltennanemn aus der Sicht nehmen.
Post by Patrick Pohlmann
Ich habe schon versucht b. vor die Spaltenname der
abgeleiteten Tabelle zu stellen, aber das stimmt dann
angeblich mit keinem in der Abfrage verwendeten Tabellennamen
überein. :-(
In der abgeleiteten Tabelle verwendest Du keinen Alias, also brauchst da
auch nichts vor. Den Select mußt Du losgelöst betrachten. Bringt er denn ein
Ergebnis?
Wenn Du im Query Analyzer arbeitest, markiere ihn mal un ddrücke auf den
grünen Pfeil.
Post by Patrick Pohlmann
Nochmals vielen Dank für die Geduld.
Ne, da nich für ;-)

Gruß
Christa
--
Access-FAQ: http://www.donkarl.com
SQL-Server-FAQ: http://www.berndjungbluth.de/sqlfaq/sqlfaq.htm
auch interessant: http://www.insidesql.de
Suchen in den Newsgroups:
http://groups.google.de/advanced_group_search?hl=de&lr=&ie=UTF-8
Patrick Pohlmann
2004-11-23 18:05:26 UTC
Permalink
Hallo Christa,

jetzt hab ich es. Hab das ganze Ding mal neu im Profiler aufgebaut und mich
Schritt für Schritt rangetastet. Ob je, wie einfach!

Zwei Fehler:
Ich hatte einen Tippfehler bei der GroupBy Funktion (Vetrag statt Vertrag!
Ich habs einfach nicht gesehen!

Dann hatte ich den Link auf SummeNettoRabatt, aber dieses Feld habe ich im
Select ja gar nicht abgefragt, sondern MIN(SummeNettoRabatt) as MinKosten.
Auf dieses Feld muss dann ja auch der Link zielen.

Das Statement sieht jetzt wie folgt aus und funktioniert auch:

SELECT a.VertragNr, a.RahmentarifID, a.SummeNettoRabatt
FROM tmpSicht_SummeJeTarif as a INNER JOIN
(SELECT VertragNr, MIN(SummeNettoRabatt) AS MinKosten
FROM tmpSicht_SummeJeTarif GROUP BY
VertragNr) as b ON a.VertragNr = b.VertragNr AND
a.SummeNettoRabatt = b.MinKosten

Nochmals vielen Dank für Deine Mühe. Nicht nur für dieses eine Mal, Du hast
mir ja schon sehr oft geholfen.

Ich hab wieder viel gelernt.

Viele Grüße und schönen Abend

Patrick!
Post by Christa Kurschat
Du solltest schon die Spaltennanemn aus der Sicht nehmen.
Post by Patrick Pohlmann
Ich habe schon versucht b. vor die Spaltenname der
abgeleiteten Tabelle zu stellen, aber das stimmt dann
angeblich mit keinem in der Abfrage verwendeten Tabellennamen
überein. :-(
In der abgeleiteten Tabelle verwendest Du keinen Alias, also brauchst da
auch nichts vor. Den Select mußt Du losgelöst betrachten. Bringt er denn ein
Ergebnis?
Wenn Du im Query Analyzer arbeitest, markiere ihn mal un ddrücke auf den
grünen Pfeil.
Christa Kurschat
2004-11-24 08:09:15 UTC
Permalink
Hallo Patrick,
Post by Patrick Pohlmann
Hallo Christa,
jetzt hab ich es. Hab das ganze Ding mal neu im Profiler
aufgebaut und mich Schritt für Schritt rangetastet. Ob je, wie
einfach!
Wenn man es erstmal verstanden hat, ist es das auch.

[...]
Post by Patrick Pohlmann
Nochmals vielen Dank für Deine Mühe. Nicht nur für dieses eine
Mal, Du hast mir ja schon sehr oft geholfen.
Ich hab wieder viel gelernt.
So soll es auch sein.
Ich habe selber viel aus der NG gelernt und gebe das gerne weiter.

Gruß
Christa
--
Access-FAQ: http://www.donkarl.com
SQL-Server-FAQ: http://www.berndjungbluth.de/sqlfaq/sqlfaq.htm
auch interessant: http://www.insidesql.de
Suchen in den Newsgroups:
http://groups.google.de/advanced_group_search?hl=de&lr=&ie=UTF-8
Loading...