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

Datenbank filtern

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von havefun, 2 Januar 2019.

  1. havefun

    havefun Benutzer

    Hallo zusammen,
    leider muß ich euch mit meinen Problemen belasten.

    Ich habe eine Datenbank mit 3 Spalten
    Diese möchte ich nach zwei Strings (im Beispiel nach"HDD_05 und "HDD_07) in der name-Spalte
    und zusätzlich nach Mehrfach-Werten in der bytes-Spalte filtern.
    Im SQL-Management-Studio funktioniert der erste Teil(Strings) aber daß zusätzlich nach Mehrfach-Werten gefiltert wird,
    kriege ich einfach nicht hin.
    Nach stundenlangen erfolglosen Versuchen setze ich nun auf Hilfe von Menschen mit mehr Erfahrung auf dem Gebiet.
    Schon mal danke und ein gutes neues Jahr

    SELECT bytes, name
    FROM gesamt_11_09
    WHERE (name LIKE 'HDD_05%') OR (name LIKE 'HDD_07%')
    HAVING count([bytes]) >1

    Hier die letzte Fehlermeldung:
    Meldung 8120, Ebene 16, Status 1, Zeile 1
    Die gesamt_11_09.bytes-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.
     
  2. castorp

    castorp Datenbank-Guru

    Datenbanken haben keine Spalten - Tabellen enthalten Spalten (und Datenbanken enthalten Tabellen).

    Du musst ein GROUP BY verwenden, wenn Du eine Aggregationsfunktion im HAVING verwendest. Was genau soll denn die Ausgabe sein? Wenn Du z.B. Anzahl der Bytes pro Name willst, dann funktioniert das folgende:

    Code:
    SELECT name, sum(bytes)
    FROM gesamt_11_09
    WHERE (name LIKE 'HDD_05%') OR (name LIKE 'HDD_07%')
    GROUP BY name
    HAVING count(bytes) >1;
     
  3. havefun

    havefun Benutzer


    Hallo,
    danke für die schnelle Antwort.
    Die Ausgabe sollte folgendermaßen aussehen:
    name bytes
    HDD_05xx.xxx 111111111
    HDD_07yy.yyy 111111111

    mit GROUP BY
    habe ich das auch probiert.
    Dadurch haben sich nur die Spalten der Tabelle in der Fehlermeldung geändert.
    GROUP BY name Fehlermeldung -> bytes
    GROUP BY bytes Fehlermeldung -> name
    ich werde es aber genau so eingeben wie du es mir geschrieben hast.
    Bis dann
     
  4. castorp

    castorp Datenbank-Guru

    Die Spalten die nicht Teil des GROUP BY sind, müssen in einer Aggregatsfunktion (sum, count, ...) verwendet werden.
     
  5. havefun

    havefun Benutzer

    ich meine zwar,alle möglichen Kombinationen ausprobiert zu haben und habe es auch nach Beispielen
    eingegeben,habe aber vielleicht doch was vergeigt.
    Nach der Arbeit gehe ich nochmal ran.
     
  6. havefun

    havefun Benutzer

    Hallo,
    Abfrage wird erfolgreich ausgeführt ,liefert aber keine Werte zurück.
    Angezeigt werden zwei Spalten: "name" und "kein Spaltennahme"
    Es sind aber definitiv Werte doppelt.
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Bei Deinem Talent mit Begriffen umzugehen vermute ich, daß Du bisher völlig falsch verstanden wurdest. Kann es z.B. sein, daß Du mehrere Werte in einer Spalte führst, z.B. als Text und Komma-getrennt?
     
  8. havefun

    havefun Benutzer

    Hallo,


    Hallo,
    ich versuche hiermit,mich verständlich auszudrücken.
    Die Tabelle besteht aus drei Spalten:

    1.) name -> beliebige Zeichenketten
    2.) bytes -> Integer-Werte
    3.) Nummer -> Autoinkrement-Schlüsselfeld

    Erste Spalte soll nach Zwei Teilstrings UND die zweite Spalte nach mehrfach vorhandenen, beliebigen Werten gefiltert werden.
    Die Ausgabe soll also nur Datensätze anzeigen deren erste Spalte einen der Teilstrings enthält und deren zweite Spalte den gleichen Wert hat.


    name bytes

    HDD_05xx.xxx 111111111
    HDD_07yy.yyy 111111111



    Ich hoffe mit den Begriffen hat es jetzt besser geklappt.
     
  9. akretschmer

    akretschmer Datenbank-Guru

    Hrm. Nicht sicher, aber evtl. hilft Dir das ja:

    Code:
    test=*# select * from havefun ;
         name     |   bytes   
    --------------+-----------
     HDD_05xx.xxx | 111111111
     HDD_07yy.yyy | 111111111
    (2 rows)
    
    test=*# with x as (select bytes, count(1) from havefun group by bytes) select havefun.* from havefun left join x on havefun.bytes=x.bytes where ((name LIKE 'HDD_05%') OR (name LIKE 'HDD_07%')) and x.count > 1;
         name     |   bytes   
    --------------+-----------
     HDD_07yy.yyy | 111111111
     HDD_05xx.xxx | 111111111
    (2 rows)
    
    test=*#
    
    PostgreSQL, aber M$SQL kann auch WITH-Syntax.
     
  10. havefun

    havefun Benutzer

    Hallo,
    habe den Tabellen-Namen angepasst.

    test=*# with x as (select bytes, count(1) from [dbo].[Directory] group by bytes) select * from [dbo].[Directory] left join x on [dbo].[Directory].bytes=x.bytes where ((name LIKE 'HDD_05%') OR (name LIKE 'HDD_07%')) and x.count > 1;

    arbeite mit Microsoft SQLEXPRESS und dem Microsoft SQL Management Studio.
    Hier die Meldungen:

    Meldung 102, Ebene 15, Status 1, Zeile 1
    Falsche Syntax in der Nähe von "=".
    Meldung 319, Ebene 15, Status 1, Zeile 1
    Falsche Syntax in der Nähe des WITH-Schlüsselworts. Falls diese Anweisung ein allgemeiner Tabellenausdruck, eine XMLNAMESPACES-Klausel oder eine CHANGE TRACKING CONTEXT-Klausel ist, muss die vorherige Anweisung mit einem Semikolon abgeschlossen werden.
    Meldung 102, Ebene 15, Status 1, Zeile 2
    Falsche Syntax in der Nähe von "name".

    "test" ist als fehlerhaft markiert.
    Kommentar:Die gespeicherte Prozedur "test" wurde nicht gefunden.

    "count" ist als fehlerhaft markiert.
    Kommentar:Ungültiger Spaltenname "count"

    Erstes "x" ist als fehlerhaft markiert.
    Kommentar: Für die Spalte '2' von'x' wurde keine Spalte angegeben.
     
  11. akretschmer

    akretschmer Datenbank-Guru

    Das "test=*#" ist der Prompt der Datenbank. Ungefähr das, was Du in einem MS-DOS-Fenster als "C:\" zu sehen bekommst.
     
  12. havefun

    havefun Benutzer

    Wieder was dazugelernt.
    Hilft mir nur im Moment nicht weiter
     
  13. akretschmer

    akretschmer Datenbank-Guru

    Nun - da es der Prompt ist, ist es wohl nicht Bestandteil des Kommandos, oder?
     
  14. havefun

    havefun Benutzer

    Bin jetzt zu Hause.Tabellenname ist korrekt.

    with x as (select bytes, count(1) from [dbo].[gesamt_11_09] group by bytes) select * from [dbo].[gesamt_11_09] left join x on [dbo].[gesamt_11_09].bytes=x.bytes where ((name LIKE 'HDD_05%') OR (name LIKE 'HDD_07%')) and x.count > 1;

    Meldung 8155, Ebene 16, Status 2, Zeile 1
    Kein Spaltenname wurde für die Spalte 2 von "x" angegeben.

    "count" ist als fehlerhaft markiert.
    Kommentar:Ungültiger Spaltenname "count"

    Erstes "x" ist als fehlerhaft markiert.
    Kommentar: Für die Spalte '2' von'x' wurde keine Spalte angegeben.
     
  15. akretschmer

    akretschmer Datenbank-Guru

    mach mal ein

    Code:
    with x as (select bytes, count(1) from [dbo].[gesamt_11_09] group by bytes) select * x
    
    kann schon sein, daß M$SQL sich etwas anders verhält, die Spalten andere Namen haben etc.
     
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