Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Anzahl der Datensätze vorgeben

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von halbwissen, 24 April 2012.

  1. halbwissen

    halbwissen Benutzer

    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.
     
  2. ukulele

    ukulele Datenbank-Guru

    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
     
  3. halbwissen

    halbwissen Benutzer

    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?
     
  4. halbwissen

    halbwissen Benutzer

    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?
     
  5. ukulele

    ukulele Datenbank-Guru

    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?
     
  6. halbwissen

    halbwissen Benutzer

    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.
     
  7. ukulele

    ukulele Datenbank-Guru

    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:
    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.
     
  8. halbwissen

    halbwissen Benutzer

    Danke fü den Ansatz. Könnte ich mir so vorstellen. Das probiere ich mal so aus. Vielen Dank
     
  9. ukulele

    ukulele Datenbank-Guru

    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.
     
    PLSQL_SQL gefällt das.
  10. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    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
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden