Nur bestimmte Spalten auswählen und gruppieren

Mufasa1601

Grünschnabel
Hallo Freunde,

da wie jeder meiste Neuzugang in diesem Forum, stehe ich auf dem Schlau. Ich hoffe ihr könnt mir helfen, da ich über die Suche nichts gefunden habe.
Kommen wir zum Problem:
Ich hab eine Tabelle in Oracle mit 5 Spalten, davon möchte ich aber nur 3 angezeigt bekommen.

So sieht die Tabelle momentan aus nachdem selektieren:

Produkt Marke Nummer
Stange Mahle 1
Holz Frank 2
Stange Frank 1
Glas Hans 4
Holz Jens 10
Stange Mahle 3
Glas Hans 6
Holz Kurt 2

bla bla.....

Mein OUTPUT sollte so sein:
Produkt Marke Nummer
Stange Mahle 1
Stange Mahle 3
Glas Hans 4
Glas Hans 6

D.h. Gleiches Produkt, gleiche Marke unterschiedliche Nummer
Die anderen sollen gar nicht gelistet werden. Aufsteigend sortiert.

oder:
Gleiches Produkt und gleiche nummer, aber unterschiedliche Marke z.B.

Produkt Marke Nummer
Stange Mahle 1
Stange Frank 1
Holz Frank 2
Holz Kurt 2


Mein bisheriger Ansatz für den ersten OUTPUT:
SELECT PRODUKT, MARKE, NUMMER
FROM LISTE
GROUP BY PRODUKT, NAME, NUMMER
HAVING COUNT (*) >1
ORDER BY PRODUKT ASC, NAME ASC, CAST(NUMMER AS INT) ASC;


Hat jemand ne Ahnung?
Danke
 
Der Ansatz ist gut. Aber nicht gut genug.
Fall 1: Du musst eine Unterabfrage machen, in der nur nach Produkt & Marke gruppiert und gezählt wird. Dann diejenigen Zurückverknüpfen, bei denen der Zähler grösser als 1 ist.

SQL:
select
    lst.*
from
    (
        select product, marke, count(*) as cnt
        from liste
        group by product, marke
    ) as grp,
    liste as lst
where
    grp.product = lst.product
    and grp.marke = lst.marke
    and grp.cnt > 1
order by product, name, cast(nummer as int)

Für den Fall 2 analog. Einfach nach Product & Nummer gruppieren
 
Hallo Yaslaw

danke für die Antwort. Leider bekomm ich den Fehler:
ORA-00933: SQL command not properly ended

Was mach ich falsch? Bin relativ neu in diesem Gebiet.
 
Stimmt, ist ja Oracle. Also die Tabellenaliase ohne AS
SQL:
SELECT
    lst.*
FROM
    (
        SELECT product, marke, COUNT(*) AS cnt
        FROM liste
        GROUP BY product, marke
    ) grp,
    liste lst
WHERE
    grp.product = lst.product
    AND grp.marke = lst.marke
    AND grp.cnt > 1
ORDER BY product, name, CAST(nummer AS INT)
 
Wieder danke Yaslaw...leider nächster error in zeile 14.
ORA-00918: column ambiguously defined

Woran liegt das? Weil die vllt nicht im SELECT sind?
Nochmals vielen Dank
 
Jepp. In ORDER BY vor jeden Feldnamen noch ein 'lst.' setzen
SQL:
ORDER BY lst.product, lst.name, CAST(lst.nummer AS INT)

Merkt man, dass ich normalerweise eine Code schreibe und dann schaue wo es knallt?
 
Danke Yaslaw.
Ja in der Tat....obwohl ich jetzt alles so gemacht habe wie du, bekomm ich jetzt alle Spalten.
Ich habe mehrere Spalten in der Tabelle, will aber nur das die 3 angezeigt und sortiert werden.

Wo liegt das Problem?
 
Doppelt bringt er nur aus, was doppelt drin ist. Wenn du diese unterbinden willst setze ein DISTINCT.
Umd ie Felder einzugrenzen, liste die Felder im SELECT auf.
SQL:
SELECT DISTINCT lst.product, lst.marke, lst.nummer
FROM
    (..
 
Zurück