Anzahl der Datensätze vorgeben

halbwissen

Benutzer
Beiträge
5
Sagen wir mal ich habe eine einfache Tabelle
Artikel, name
In dieser Tabelle kommt jeder Artikel ca. 1000 mal vor. (ist nur ein Bsp.)

Nun möchte ich für die unterscheidlichen Artikel unterschiedlich viele Ergebniszeilen haben

Artikel 1 = 3 Zeilen
Artikel 2 100 Zeilen

Wenn ich das global einstellen wollte (top 100), ist klar.
Aber wie macht man das in diesem Fall? Gibt es da einen Weg?
Mit Case scheint das nicht zu funktionieren, oder?


Hintergrund:
Das ist hier nur ein starkt vereinfachtes Beispiel. Diese Abfrage wird in einem Report eingefügt und über die Anzahl der Datensätze möchte ich die Anzahl an Seiten steuern können, die dann gedruckt werden.
 
Werbung:
Verstehe ich nicht ganz, du kriegst doch immer nur soviele Zeilen zurück (pro Artikel), wie in der Tabelle (pro Artikel) vorhanden sind. Wenn du also nur einen Artikel abfragst bekommst du auch nur soviele Treffer (Ergebniszeilen) wie er Einträge in der Tabelle hat. Oder möchtest du für jeden Artikel nur eine Zeile mit der Anzahl der Treffer haben? Das wäre dann mit
Code:
SELECT    Artikel,
        count(*)
FROM    Artikel
GROUP BY Artikel
 
Sorry, aber das ist genau das was ich nicht wollte. Wie unter "Hintergrund" beschrieben möchte ich die Ergebniszahlen pro Artikel unterscheidlich einschränken. Die Anzahl (count) der Datensätze hilft mir hier nicht weiter, da diese wie beschrieben immer gleich ist und ich mit dieser Zahl nichts anfangen kann.
Evtl. andere Vorschläge?
 
Eine Idee wäre ja für jeden Artikel eine Abfrage zu machen und mit Top zu begrenzen. Die Abfragen könnte man dann mit "go" verketten (alle Abfragen zusammen ausführen). Da es sich um ca. 30-40 Artikel habelt, wird das ganze zu groß/unübersichtlich.

Ich würde es gerne in einer Abfrage lösen. Ähnlich wie mit CASE. Wenn Artikel A dann top 10, wenn Artikel B dann top 20 usw.
Nur ist es meines wissens nicht möglich (Syntax) CASE mit TOP zu verbinden, oder?
 
Also du hast 33 Artikel des Typs A und 42 des Typs B und willst jetzt, in einem SELECT, 10 Artikel des Typ A und 20 Artikel Typ B ausgeben, richtig? Oder wird immer nur ein Typ gleichzeitig abgefragt, dann könntest du es tatsächlich mit CASE und TOP lösen.

Ist dieser Wert, also wieviele Artikel pro Typ zurück gegeben werden sollen, immer identisch oder variabel?
 
Frage 1: Ja genau das ist das Ziel
Frage 2: nein
Frage 3: der Wert ist immer Fix und nicht in der Tabelle hinterlegt. Könnte ich aber tun, wenn es die Sache einfacher macht.
 
Die Schwirigkeit scheint in der variablen Anzahl von Artikeltypen zu liegen, mir fällt keine Möglichkeit ein das in einen Select zu packen ohne dabei vorher eine Schleife oder sonstwas laufen zu lassen. So könnte man es mit einer festen Anzahl von Typen machen:
SELECT *
FROM tabelle
WHERE pk IN ( SELECT TOP 10 pk
FROM tabelle
WHERE typ = 'A'
ORDER BY bezeichnung )
OR pk IN ( SELECT TOP 5 pk
FROM tabelle
WHERE typ = 'B'
ORDER BY bezeichnung )
ORDER BY bezeichnung
Besonders elegant ist das aber nicht. Vieleicht hilft es auch, mit einem Cursor mehrere SELECTs zu machen. Die TOP Anweisung kann auch mit Variablen ausgeführt werden, so das man sich TOP @anzahl und @tabellenname aus einer anderen Tabelle holt und alles hintereinander hängt. Hab ich aber auch noch nie gemacht.
 
Je länger ich darüber nachdenke komme ich zu der Überzeugung das du den SELECT mittels Schleife (WHILE) zusammenbauen und mittels EXEC ausführen musst. Dann könnte man alle Einträge in einer Tabelle speichern (Typ und die Anzahl der zurückzugebenden Datensätze) und für jeden weiteren Eintrag eine Bedingung wie oben mit OR anhängen oder mehrere SELECTs mit UNION ALL verknüpfen. Einen Anderen Weg finde ich nicht.
 
Werbung:
Soweit ich weiß, kann dies nur mittels Schleife programmtechnisch gelöst werden.

Es ist hier notwendig, die Select-Stmts abhängig von einem Parameter (Typ) dynamisch zu generieren.
Ich würde dazu eine Config-Tabelle anlegen, um zukünftige Artikeltypen ebenfalls in die dynamische Stmt-Erzeugung einbinden zu können und immer den TOP - Wert festlegen zu können.

z.B.: eine Tabelle names "my_config_table", mit den Spalten "ArtikelTyp" und "TopCount"

Lg
 
Zurück
Oben